Dijkstra算法是基于并查集的算法,理解较为简单。
参考代码:
#<span style="font-size:18px;">include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=105,M=10000;
struct road{
int a,b,c;
};
road a[N];
int father[M];
int f(int x){
int r=x,k;
while (father[r]!=r)
r=father[r];
while (father[x]!=x)
{
k=father[x];
father[x]=r;
x=k;
}
return r;
}
void init(int x){
for (int i=1;i<=x;i++) father[i]=i;
}
bool comp(road x,road y){
return x.c<y.c;
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)&&n!=0)//m代表村庄数,n代表路的条数
{
int ans(0);
init(m);
for (int i=0;i<n;i++) scanf("%d %d %d",&a[i].a,&a[i].b,&a[i].c);
sort(a,a+n,comp);
for (int i=0;i<n;i++){
int k1=f(a[i].a),k2=f(a[i].b);
if (f(a[i].a)!=f(a[i].b)){
father[k1]=father[a[i].a]=father[a[i].b]=k2;
ans+=a[i].c;
}
printf(“%d\n”,ans);
}
return 0;
}
</span>