bzoj 3390[Usaco2004 Dec]Bad Cowtractors牛的报复
水题 最大生成树 用Kruskal算法倒过来算,如果不是所有点都被连上就输出-1
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,cnt,ans,tot; 4 int fa[1005]; 5 struct edge{ 6 int u,v,w; 7 }e[20005]; 8 void insert(int i,int j,int k){ 9 cnt++; 10 e[cnt].u=i;e[cnt].v=j;e[cnt].w=k; 11 } 12 int getfa(int x){ 13 return fa[x]==x?x:getfa(fa[x]); 14 } 15 bool cmp(edge a,edge b){ 16 return a.w>b.w; 17 } 18 int main(){ 19 scanf("%d%d",&n,&m); 20 int x,y,z; 21 for(int i=1;i<=m;i++){ 22 scanf("%d%d%d",&x,&y,&z); 23 insert(x,y,z); 24 } 25 for(int i=1;i<=n;i++)fa[i]=i; 26 sort(e+1,e+cnt+1,cmp); 27 for(int i=1;i<=cnt;i++){ 28 int faa=getfa(e[i].u); 29 int fab=getfa(e[i].v); 30 if(faa!=fab){ 31 fa[faa]=fab; 32 ans+=e[i].w; 33 tot++; 34 } 35 } 36 if(tot==n-1)printf("%d",ans); 37 else printf("-1"); 38 return 0; 39 }