题目链接>>>
题目大意:
谷仓之间有一些路径长度,然后要在这些谷仓之间建立一些互联网,花费的成本与长度成正比,,并且要使这些边连起来看的像一课“树”,然后使成本最大
解题思路:
最大生成树
用kruskal在最小生成树的基础上,将排序从大到小排序,这样就是一个最大生成树了
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct EDGE{ int x,y; long long c; }edge[30000]; int father[1010]; int n,m; bool cmp(EDGE a,EDGE b){ return a.c>b.c; } int find(int x){ if(father[x]==x)return x; father[x]=find(father[x]); return father[x]; } void Kruskal(){ long long sum=0,s=0; sort(edge+1,edge+1+m,cmp); for(int i=1;i<=m;i++){ int f1=find(edge[i].x); int f2=find(edge[i].y); if(f1!=f2){ father[f2]=f1; sum+=edge[i].c; s++; } if(s==n-1)break; } if(s==n-1)printf("%lld ",sum); else printf("-1 "); } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++)father[i]=i; for(int i=1;i<=m;i++){ scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].c); } Kruskal(); } return 0; }
2018-04-01