HAHAHA奶牛题。。。。最大生成树。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 2050 #define maxe 40050 using namespace std; struct edge { int u,v,w; }e[maxe]; int n,m,father[maxv],ans=0; bool cmp(edge x,edge y) { return x.w>y.w; } int getfather(int x) { if (x!=father[x]) father[x]=getfather(father[x]); return father[x]; } void kruskal() { for (int i=1;i<=n;i++) father[i]=i; sort(e+1,e+m+1,cmp); for (int i=1;i<=m;i++) { int u=e[i].u,v=e[i].v,w=e[i].w; int f1=getfather(u),f2=getfather(v); if (f1!=f2) {father[f1]=f2;ans+=w;} } } bool check() { for (int i=2;i<=n;i++) { if (getfather(i)!=getfather(i-1)) return false; } return true; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); kruskal(); if (check()) printf("%d\n",ans); else printf("-1\n"); return 0; }