题目描述
略
代码
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define open(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout);
#define close fclose(stdin); fclose(stdout);
using namespace std;
struct Edge
{
int from;
int to;
int w;
bool operator < (const Edge &b) const
{
return w<b.w;
}
};
int ans;
int n,m;
Edge edge[200005];
int fa[5005];
int size[5005];
int find(int x) //路径压缩
{
return fa[x]=(fa[x]!=x?find(fa[x]):x);
}
bool join(int x,int y,int &t)
{
int x1=find(x),y1=find(y);
if(x1==y1) return 0;
--t;
if(size[x1]>size[y1]) //启发式合并
{
fa[y1]=x1;
size[x1]+=size[y1];
}else
{
fa[x1]=y1;
size[y1]+=size[x1];
}
return 1;
}
void kruskal()
{
sort(edge+1,edge+m+1);
for(int i=1;i<=n;++i)
{
fa[i]=i;
size[i]=1;
}
int ans=0;
int t=n-1;
for(int i=1;i<=m && t;++i)
if(join(edge[i].from,edge[i].to,t))
ans+=edge[i].w;
if(t) printf("orz"); else printf("%d",ans);
}
int main()
{
open("3366");
scanf("%d %d",&n,&m);
for(int i=1;i<=m;++i)
scanf(" %d %d %d",&edge[i].from,&edge[i].to,&edge[i].w);
kruskal();
close;
return 0;
}