这道题的难点在于边的数量是unlimited的,有无限条,用prim算法可以很容易的解出,不过个人比较喜欢用Kruskal算法,所以就想了办法处理了一下数据,然后就可以用Kruskal算法解了
主要在于对于数据的去重,因为边数不会超过点数*(点数-1)/2,所以只将两个点最小的边存下来就可以进行kruskal算法了,数组开到1800就绰绰有余了。
#include<iostream>
#include<algorithm>
using namespace std;
class road
{
public:
int st,ed;
int w;
}point[1800];
int f[60];
int map[60][60];
int find(int x)
{
if(f[x]==x)
{
return f[x];
}
return find(f[x]);
}
int cmp(road a,road b)
{
return a.w<b.w;
}
int main()
{
int p,r;
while(cin>>p)
{
if(p==0)
{
break;
}
cin>>r;
for(int i=0;i<60;i++)
{
f[i]=i;
}
for(int i=0;i<60;i++)
{
for(int j=0;j<60;j++)
{
map[i][j]=200;
}
}
int a,b,c;
for(int i=0;i<r;i++)
{
cin>>a>>b>>c;
if(c<map[a][b])
{
map[a][b]=map[b][a]=c;
}
}
int tot=0;
for(int i=0;i<60;i++)
{
for(int j=0;j<60;j++)
{
if(map[i][j]!=200)
{
point[tot].st=i;
point[tot].ed=j;
point[tot++].w=map[i][j];
}
}
}
sort(point,point+tot,cmp);
int ans=0;
for(int i=0;i<tot;i++)
{
if(find(point[i].st)!=find(point[i].ed))
{
f[find(point[i].ed)]=find(point[i].st);
ans+=point[i].w;
}
}
cout<<ans<<endl;
}
}