Эффективное представление списка смежности в C ++ - PullRequest
1 голос
/ 02 мая 2020

Стандартное представление списка смежности для взвешенных графов в C ++ представляет собой массив векторов пар часто (ie. vector<pair<int, int>> adj[N]). У меня нет проблем с этим, когда я знаю размер N во время компиляции, и если N не слишком большой. Однако, когда N известен только во время выполнения (переменная), мне приходится прибегать к тому, чтобы сделать N верхней границей размера списка смежности. Я часто сталкиваюсь с ошибками сегментации, где, если я не ошибаюсь, массив max_size превышен. Например, в настоящее время я сталкиваюсь с этой проблемой с границами N <= 3000 * 2999/2 (около 45000000). Ниже приведен пример с алгоритмом MST Прима, в котором я получаю ошибку сегментации. Как я могу избежать этого? Должен ли я рассмотреть другие типы данных? Спасибо! Изменить: я мог бы просто использовать вектор и инициализировать его с al oop от 1 до n, но мне интересно, есть ли более эффективный способ. </p>

int prims(int n, vector<vector<int>> edges, int start) {
vector<pair<int, int>> adj[45000000];
for(vector<int> edge : edges){
    adj[edge[0]].push_back({edge[2], edge[1]});
    adj[edge[1]].push_back({edge[2], edge[0]});
}
vector<bool> visited;
for(int i=0; i<n; i++){
    visited.push_back(false);
}
int dist = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, start});
while(!pq.empty()){
    pair <int, int> p = pq.top();
    pq.pop();
    // cout << "top is " << p.second << "\n";
    if(visited[p.second]) continue;
    visited[p.second] = true;
    dist += p.first;
    for(pair<int, int> j : adj[p.second]){
        if(!visited[j.second]){
            pq.push(j);
        }
    }
}
return dist; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...