标签:
这个时间短 700多s #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct node{ int u; int v; int w; }que[100000]; int father[505]; bool cmp(struct node a,struct node b){ return a.w<b.w; } void init(int n){ for(int i=1;i<=n;i++) father[i]=i; } int find(int u){ if(father[u]!=u) father[u]=find(father[u]); return father[u]; } int main(){ int t; scanf("%d",&t); while(t--){ int n,m,k; int edge=0,sum=0; scanf("%d%d%d",&n,&m,&k); init(n); for(int i=0;i<m;i++){ scanf("%d%d%d",&que[i].u,&que[i].v,&que[i].w); } sort(que,que+m,cmp); for(int i=1;i<=k;i++){ int cnt,root; scanf("%d%d",&cnt,&root); for(int j=1;j<cnt;j++){ int x; scanf("%d",&x); int c1=find(x),c2=find(root); if(c1!=c2){ father[c1]=c2; } } } for(int i=1;i<=n;i++) if(father[i]==i) edge++; bool flag=false; for(int i=0;i<m;i++){ int tx=find(que[i].u),ty=find(que[i].v); if(tx!=ty){ father[tx]=ty; sum+=que[i].w; edge--; } if(edge==1){ flag=true; break; } } if(flag) printf("%d\n",sum); else printf("-1\n"); } return 0; }
Time Limit: 1000 MS Memory Limit: 32768 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
1
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct node{ int u,v,w; }que[105000]; int father[505]; bool cmp( node a, node b){ return a.w<b.w; } void init(int n){ for(int i=1;i<=n;i++) father[i]=i; } int find(int u){ if(father[u]!=u){ father[u]=find(father[u]); } return father[u]; } int main(){ int t; scanf("%d",&t); while(t--){ int n,m,k;/// int sum,edge;//这些变量我一定义在外部就会超时,只能定义在内部,那样也是飘过,980多s,好险好险 int uu,vv,ww; scanf("%d%d%d",&n,&m,&k); init(n); for(int i=0;i<m;i++){ scanf("%d%d%d",&uu,&vv,&ww); que[i].u=uu; que[i].v=vv; que[i].w=ww; } sort(que,que+m,cmp); int x,zz,dd; for(int i=1;i<=k;i++){ scanf("%d%d",&x,&zz); for(int j=1;j<x;j++){ scanf("%d",&dd); int c1=find(zz),c2=find(dd); if(c1!=c2) father[c2]=c1; } } edge=0; for(int i=1;i<=n;i++){ if(father[i]==i) edge++; }//此时只需要判断还有几个相等,其中另一个含义就是看这些个点分成了几堆,不妨设为k堆,那么只需要k-1条线便可以将其他的点连接在一起,即其他的堆 sum=0; bool flag=false; for(int i=0;i<m;i++){ int a1=find(que[i].u); int a2=find(que[i].v); if(a1!=a2){ father[a1]=a2; sum+=que[i].w; edge--; } if(edge==1){ flag=true; break; } } if(flag) printf("%d\n",sum); else printf("-1\n"); } return 0; }
HDU 3371 kruscal/prim求最小生成树 Connect the Cities 大坑大坑
标签:
原文地址:http://www.cnblogs.com/13224ACMer/p/4639351.html