【发布时间】:2014-10-20 11:24:45
【问题描述】:
我正在尝试使用 STL 在 C++ 中实现 Prim 的 MST 算法。
但是对于下面的程序,它似乎进入了一个无限循环。然后报错退出。
Prim 的 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;
}
实现此算法的图表:
【问题讨论】:
-
小贴士:如果你想要一个大数来表示无穷大,那么我建议
std::numeric_limits<type>::max。 -
至于您的问题,从一组较小的输入数据(图表)开始,然后在调试器中逐行检查代码以查看发生了什么。
-
观看了 30 次后感觉很糟糕,没有人回答你的问题 :(
-
@JoachimPileborg 感谢您的提示.. :)
-
仅供参考,这些宏令人厌恶。不要写这样的代码,它会使代码less可读。 typedef 也很晦涩,但至少它们没有宏的所有缺点。
标签: c++ algorithm graph stl prims-algorithm