Реализация алгоритма Прима в C ++ STL ошибка?

Я пытаюсь реализовать алгоритм MST Prim в C ++ с использованием STL.

Но для следующей программы она, кажется, входит в бесконечный цикл. И затем выходит с ошибкой.

Псевдокод для MST-алгоритма Прима;

введите описание изображения здесь

Мой код:

#include<algorithm>
#include<vector>
#include<iostream>
#include<queue>
using namespace std;

typedef vector<int>         vi;
typedef pair<int,int>       ii;
typedef vector<ii>          vii;

#define REP(i,a,b)  for(int i=int(a);i<b;i++)
#define TRvii(c,it) for(vii::iterator it=(c).begin();it!=(c).end();it++)

#define INF 2000000000

void Prims(int V, int s, vector<vii> &AdjList)
{
vector<int> dist(V,INF);
dist[s] = 0;
priority_queue<ii,vector<ii>,greater<ii> > pq;
pq.push(ii(0,s));

REP(i,1,V) pq.push(ii(i,INF));

bool inPriorityQueue[V];
REP(i,0,V) inPriorityQueue[i] = true;

while(!pq.empty())
{
ii top = pq.top(); pq.pop();
int d = top.first,u = top.second;

inPriorityQueue[u] = false;

TRvii(AdjList[u],it)
{
int v = it->first, weight_u_v = it->second;

if(inPriorityQueue[v] && weight_u_v<dist[v])
{
dist[v] = weight_u_v;
}
}
}

cout << "The shortest distance from " << s << " to all the nodes is" << endl;
REP(i,0,V)
{
cout << i << " : " << dist[i] << endl;
}
}

int main()
{
int v,s,edges;

printf("Enter number of vertices : ");
scanf("%d",&v);

vector<vii> adjList(v+1);

printf("\nEnter source vertex : ");
scanf("%d",&s);

adjList[0].push_back(make_pair(1,4));
adjList[0].push_back(make_pair(7,8));
adjList[1].push_back(make_pair(0,4));
adjList[1].push_back(make_pair(2,8));
adjList[1].push_back(make_pair(7,11));
adjList[7].push_back(make_pair(0,8));
adjList[7].push_back(make_pair(1,11));
adjList[7].push_back(make_pair(8,7));
adjList[7].push_back(make_pair(6,1));
adjList[2].push_back(make_pair(1,8));
adjList[2].push_back(make_pair(3,7));
adjList[2].push_back(make_pair(8,2));
adjList[2].push_back(make_pair(5,4));
adjList[8].push_back(make_pair(2,2));
adjList[8].push_back(make_pair(7,7));
adjList[8].push_back(make_pair(6,6));
adjList[6].push_back(make_pair(7,1));
adjList[6].push_back(make_pair(5,2));
adjList[6].push_back(make_pair(8,2));
adjList[5].push_back(make_pair(6,2));
adjList[5].push_back(make_pair(2,4));
adjList[5].push_back(make_pair(3,14));
adjList[5].push_back(make_pair(4,10));
adjList[4].push_back(make_pair(3,9));
adjList[4].push_back(make_pair(5,10));
adjList[3].push_back(make_pair(2,7));
adjList[3].push_back(make_pair(5,14));
adjList[3].push_back(make_pair(4,9));

Prims(v, s, adjList);

return 0;
}

График, на котором реализован этот алгоритм:

введите описание изображения здесь

0

Решение

Если бы вы попытались отладить его, вы бы очень быстро обнаружили, что проблема заключается в строке:

 TRvii(AdjList[u],it)

Подумать о чем u является. Во первых обойди while петля u == s из-за pq.push(ii(0,s));, В следующем и во всех последующих циклах, однако, u == INF из-за REP(i,1,V) pq.push(ii(i,INF));,

Пытаясь получить доступ AdjList[INF] «плохо» и приводит к неопределенному поведению (в вашем случае сбой).

Я бы предложил отладку вашего алгоритма дальше, возможно, с более простым тестовым примером. Пройдите через это и посмотрите все переменные. Вероятно, вы понимаете алгоритм и какие состояния он должен пройти, поэтому следите за всеми переменными, чтобы убедиться, что они являются такими, какими они должны быть.

6

Другие решения


По вопросам рекламы [email protected]