题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz
输入输出格式
输入格式:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz
输入输出格式
输入格式:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int pre[5010];
struct node
{
int u,v;
int value;
}p[maxn];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool cmp (node x,node y)
{
return x.value<y.value;
}
void mix(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fy]=fx;
}
}
int main()
{
int n,m;
scanf("%d%d",&m,&n); //m 点 n 边
{
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
}
sort(p+1,p+n+1,cmp);
int num=0,ans=0;
init(m);
for(int i=1;i<=n&&num<m-1;i++)
{
int fx=find(p[i].u);
int fy=find(p[i].v);
if(fx!=fy)
{
pre[fy]=fx;
num++;
ans+=p[i].value;
}
}
if(num==m-1)
{
printf("%d\n",ans);
}
else
{
printf("orz\n");
}
}
return 0;
}