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;
}