1218.认路
Description
lmh刚来到山师学习,他知道以后自己要在这里生活很长时间,所以想要尽快弄清楚学校里面各种设施的位置,方便以后找路。但是他又不希望总是走回头路,希望能够走最少的路来将所有的要了解的位置都认一遍,请已经熟知学校路的你为他规划一个路径,让他可以尽快融入山师。(出发的起点与终点不固定)
Input
第一行有两个数n和m,n表示有n个需要去探索的地点,m表示有m条道路。接下来的m行,每行形如“a b c”用来表示一条道路,意思是地点a到地点b需要走的路长度为c。(1<=n<=100,1<=m<=300,1<=a,b<=n,1<=c<=10000)
Output
输出走遍学校共走了多长的路。
Sample Input
6 9 2 4 11 3 5 13 4 6 3 5 6 4 2 3 6 4 5 7 1 2 1 3 4 9 1 3 2
Sample Output
19
已经AC过的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int arr[10005];
struct edge
{
int u;
int v;
int w;
};
edge e[10005];
int cmp(edge a,edge b)
{
return a.w<b.w;
}
int getf(int v)
{
if(arr[v]==v)
return v;
else
{
arr[v]=getf(arr[v]);
return arr[v];
}
}
int merg(int v,int u)
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{
arr[t2]=t1;
return 1;
}
else
return 0;
}
int main()
{
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
int sum=0,ans=0;
memset(e,0,sizeof(e));
memset(arr,0,sizeof(arr));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e+1,e+m+1,cmp);
for(i=1;i<=n;i++)
{
arr[i]=i;
}
for(i=1;i<=m;i++)
{
if(merg(e[i].v,e[i].u))
{
ans++;
sum=sum+e[i].w;
}
if(ans==n-1)
break;
}
printf("%d\n",sum);
}
return 0;
}