题意:求最大生成树
分析:把边权值变成负值,最后取绝对值,注意最后的判断,如果生成树的边的数目小于(顶点数-1)则表示不能构成生成树
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=20020; 15 int par[maxn],rankl[maxn]; 16 17 void init(int n) 18 { 19 for(int i=0;i<=n;i++) 20 { 21 par[i]=i; 22 rankl[i]=0; 23 } 24 } 25 int findl(int x) 26 { 27 if(par[x]==x) 28 return x; 29 else 30 return par[x]=findl(par[x]); 31 } 32 void unite(int x,int y) 33 { 34 x=findl(x); 35 y=findl(y); 36 if(x==y) return; 37 if(rankl[x]<rankl[y]){ 38 par[x]=y; 39 }else{ 40 par[y]=x; 41 if(rankl[x]==rankl[y]) rankl[x]++; 42 } 43 } 44 bool same(int x,int y) 45 { 46 return findl(x)==findl(y); 47 } 48 int n,m; 49 struct edge{ 50 int u,v,cost; 51 }; 52 bool cmp(const edge e1,const edge e2){ 53 return e1.cost<e2.cost; 54 } 55 edge es[maxn]; 56 int ans; 57 int kruskal() 58 { 59 sort(es,es+m+1,cmp); 60 init(n); 61 int res=0; 62 for(int i=0;i<m;i++){ 63 edge e=es[i]; 64 if(!same(e.u,e.v)){ 65 unite(e.u,e.v); 66 res+=e.cost; 67 ans++; 68 } 69 } 70 return res; 71 } 72 int main() 73 { 74 while(cin>>n>>m) 75 { 76 for(int i=0;i<m;i++) 77 { 78 int a,b,c; 79 scanf("%d%d%d",&a,&b,&c); 80 es[i].u=a,es[i].v=b,es[i].cost=-c; 81 } 82 ans=0; 83 int cnt=0-kruskal(); 84 // cout<<ans<<endl; 85 if(ans==n-1) 86 cout<<cnt<<endl; 87 else 88 cout<<"-1"<<endl; 89 } 90 return 0; 91 }
时间: 2024-10-12 20:23:24