这个时间短 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