原题
题目分析
题目看似要求最大生成树,其实不然,输入时把所有边乘个-1,在求出来的最小生成树其实就是最大生成树了,只需要注意一下有可能无法生成连接所有点的树,这时候要输出-1.
代码
1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 #include <string> 8 #include <vector> 9 #include <stack> 10 #include <queue> 11 #include <map> 12 #include <set> 13 14 using namespace std; 15 typedef long long LL; 16 const int INF_INT=0x3f3f3f3f; 17 const LL INF_LL=0x3f3f3f3f3f3f3f3f; 18 19 typedef pair<int,int> P; 20 int n,m; 21 struct edge{int to,cost;}; 22 vector<edge> es[2000]; 23 bool used[2000]; 24 25 int prim() 26 { 27 int ans=0; 28 priority_queue<P,vector<P>,greater<P> > que; 29 for(int i=0;i<es[1].size();i++) que.push(P(es[1][i].cost,es[1][i].to)); 30 used[1]=true; 31 while(que.size()) 32 { 33 P p=que.top();que.pop(); 34 if(used[p.second]) continue; 35 ans+=-1*p.first; 36 used[p.second]=true; 37 for(int i=0;i<es[p.second].size();i++) 38 { 39 int t=es[p.second][i].to,c=es[p.second][i].cost; 40 if(!used[t]) que.push(P(c,t)); 41 } 42 } 43 for(int i=1;i<=n;i++) 44 if(!used[i]) return -1; 45 return ans; 46 } 47 48 int main() 49 { 50 // freopen("black.in","r",stdin); 51 // freopen("black.out","w",stdout); 52 cin>>n>>m; 53 for(int i=0;i<m;i++) 54 { 55 int a,b,c; 56 scanf("%d %d %d",&a,&b,&c); 57 c*=-1; 58 es[a].push_back(edge{b,c}); 59 es[b].push_back(edge{a,c}); 60 } 61 printf("%d\n",prim()); 62 return 0; 63 }