bzoj1083: [SCOI2005]繁忙的都市(最小生成树)
1083: [SCOI2005]繁忙的都市
题目:传送门
题解:
一道大水题:
第一问明显输出n-1
第二问最小生成树
秒切
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 struct node 8 { 9 int x,y,c; 10 }a[110000]; 11 int cmp(const void *xx,const void *yy) 12 { 13 node n1=*(node *)xx; 14 node n2=*(node *)yy; 15 return n1.c-n2.c; 16 } 17 int fa[110000]; 18 int findfa(int x) 19 { 20 if(x!=fa[x])fa[x]=findfa(fa[x]); 21 return fa[x]; 22 } 23 int n,m; 24 int main() 25 { 26 scanf("%d%d",&n,&m); 27 for(int i=1;i<=m;i++) 28 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c); 29 qsort(a+1,m,sizeof(node),cmp); 30 for(int i=1;i<=n;i++)fa[i]=i; 31 int ans=0; 32 for(int i=1;i<=m;i++) 33 { 34 int p=findfa(a[i].x),q=findfa(a[i].y); 35 if(fa[p]!=q) 36 { 37 fa[p]=q; 38 ans++; 39 if(ans==n-1) 40 { 41 printf("%d %d\n",n-1,a[i].c); 42 break; 43 } 44 } 45 } 46 return 0; 47 }