上周水了一场腾讯马拉松....水爆了..手速赛..囧...
本题...kruskal模板题...恶心的是C++能过..G++超时!!
#include<iostream> #include<stdio.h> #include<string.h> #include<stack> #include<queue> #include<map> #include<cmath> #include<set> #define oo 1000000000 using namespace std; struct node { int p,q,c; }line[30000]; int t,n,m,k,father[505],ans; bool cmp(node a,node b) { return a.c<b.c; } int getfather(int k) { if (father[k]!=k) father[k]=getfather(father[k]); return father[k]; } int main() { int i,j,h,x,y; scanf("%d",&t); while (t--) { scanf("%d%d%d",&n,&m,&k); for (i=1;i<=n;i++) father[i]=i; ans=0; for (i=1;i<=m;i++) scanf("%d%d%d",&line[i].p,&line[i].q,&line[i].c); while (k--) { scanf("%d%d",&h,&x); x=getfather(x); h--; while (h--) { scanf("%d",&y); father[getfather(y)]=x; } } sort(line+1,line+1+m,cmp); ans=0; for (i=1;i<=m;i++) if (getfather(line[i].q)!=getfather(line[i].p)) { ans+=line[i].c; father[father[line[i].q]]=father[line[i].p]; } for (i=2;i<=n;i++) if (getfather(1)!=getfather(i)) ans=-1; printf("%d\n",ans); } return 0; }