Input
* Line 1: Two space-separated integers: N and M * Lines 2..M+1: Each line contains three space-separated integers A, B, and C that describe a connection route between barns A and B of cost C.Output
* Line 1: A single integer, containing the price of the most expensive tree connecting all the barns. If it is not possible to connect all the barns, output -1.Sample Input
5 8 1 2 3 1 3 7 2 3 10 2 4 4 2 5 8 3 4 6 3 5 2 4 5 17Sample Output
42Hint
OUTPUT DETAILS: The most expensive tree has cost 17 + 8 + 10 + 7 = 42. It uses the following connections: 4 to 5, 2 to 5, 2 to 3, and 1 to 3. 题意:求最大生成树。 思路:只需在生成树基础上用sort降序排序。 #include<stdio.h> #include<algorithm> using namespace std; int f[1005]; struct Node{ int u,v,w; }edge[20005]; bool cmp(Node a,Node b) { return a.w>b.w; } int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int kru(int n,int m) { int i; for(i=1;i<=n;i++){ f[i]=i; } sort(edge+1,edge+m+1,cmp); int cnt=0,ans=0; for(i=1;i<=m;i++){ int u=edge[i].u; int v=edge[i].v; int w=edge[i].w; int fu=find(u),fv=find(v); if(fu!=fv){ ans+=w; f[fv]=fu; cnt++; } if(cnt==n-1) break; } if(cnt<n-1) return -1; else return ans; } int main() { int n,m,u,v,w,i; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); edge[i].u=u; edge[i].v=v; edge[i].w=w; } printf("%d\n",kru(n,m)); return 0; }
转载于:https://www.cnblogs.com/yzm10/p/7277231.html
