算法跟Dijkstra很像 ,但是要特别注意两点:1.最好使用一个额外的数组来保证每个点只被访问一次,否则的话应该保证在35行处使用e.dis>=dis[e.num]而不仅是>,否则会造成一些相等的额外相加。
2.40行的地方要注意与Dijkstra的区别!!不是加而是直接换!!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct edge{
int to,cost;
};
vector<edge>G[5005];
struct d{
int num,dis;
};
bool operator <(d a,d b)
{
return a.dis>b.dis;
}
bool vis[5005];
int main()
{
int n,m,i,j,k;
cin>>n>>m;
for(i=1;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
G[a].push_back(edge{b,c});
G[b].push_back(edge{a,c});
}
int dis[5005];memset(dis,0x7f,sizeof(dis));dis[1]=0;
priority_queue<d>que;que.push(d{1,0});
int ans=0;
while(!que.empty()){
d t=que.top();que.pop();
if(vis[t.num])continue;
ans+=t.dis;vis[t.num]=true;
for(i=0;i<G[t.num].size();i++){
edge e=G[t.num][i];
if(dis[e.to]>e.cost){
dis[e.to]=e.cost;
que.push(d{e.to,dis[e.to]});
}
}
}
cout<<ans<<endl;
return 0;
}