Networking UVALive - 2515 (最小生成树,适合kruskal)
Networking
kruskal模板题了,不解释
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define int long long
#define endl '\n'
#define sc(x) scanf("%lld",&x)
using namespace std;
struct edge{
int u,v,w;
edge(){}
edge(int _u,int _v,int _w):u(_u),v(_v),w(_w){}
friend bool operator<(edge a,edge b)
{
return a.w>b.w;
}
};
int fa[50];
priority_queue<edge> q;
void init(int n)
{
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return 0;
fa[fx]=fy;
return 1;
}
int32_t main()
{
int n,k;
while(cin>>n&&n)
{
cin>>k;
int cnt=0;
init(n);
while(k--)
{
int u,v,w;
sc(u),sc(v),sc(w);
edge E(u,v,w);
q.push(E);
}
int ans=0;
while(!q.empty())
{
edge E=q.top();
q.pop();
if(merge(E.u,E.v))
{
ans+=E.w;
if(++cnt==n-1)
{
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}