注意是求最大生成树
需要判定图是否连通。
/*
qq:1239198605
ctgu_yyf
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int par[1005];
int rank[1005];
int n,m;
struct Edge{
int u;
int v;
int cost;
};
Edge edge[20005];
bool cmp(const Edge &a,const Edge &b)
{
return a.cost>b.cost;
}
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]<rank[y])
par[x]=y;
else
{
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
}
bool same(int x,int y)
{
return find(x)==find(y);
}
int kruskal()
{
int res=0;
init(n);
int count=0;
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(same(edge[i].u,edge[i].v)==false)
{
unite(edge[i].u,edge[i].v);
res=res+edge[i].cost;
count++;
}
}
if(count==n-1)
return res;
else
return -1;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>edge[i].u>>edge[i].v>>edge[i].cost;
}
cout<<kruskal()<<endl;
return 0;
}