改一个错误真不容易,刚开始没有加上used数组,没有判断每个顶点是否已经加入到数组当中,结果同一个顶点被pop不止一次。
struct edge{int to,cost;}; typedef pair<int,int> P;//first集合X到i的最短距离,second点的编号 int ranchNumber,roadNumber;//顶点个数,道路个数 int mincost[10005];//每个顶点到集合x的最短距离 bool used[10005];//每个顶点是否已经加入到集合中 vector<edge> g[100005]; //顶点编号从0开始; int heapPrime(){ priority_queue<P,vector<P>,greater<P> > que; fill(mincost,mincost+10005,INF); fill(used,used+10005,false); mincost[0]=0; int ans=0; que.push(P(mincost[0],0)); for(int j=0;j<ranchNumber;j++){ P p=que.top(); while(used[p.second]==true){ que.pop(); p=que.top(); } que.pop(); used[p.second]=true; ans+=p.first; int e=p.second; for(int i=0;i<g[e].size();i++){ edge ee=g[e][i]; if(mincost[ee.to]>ee.cost){ mincost[ee.to]=ee.cost; que.push(P(mincost[ee.to],ee.to)); } } } return ans; }