最小生成树板子

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出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;
}

猜你喜欢

转载自blog.csdn.net/cgmm2333/article/details/82630621
今日推荐