[SCOI2005]繁忙的都市--Kruskal

版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/87606094

[SCOI2005]繁忙的都市

第一次自己做出来个省选题
在这里插入图片描述
在这里插入图片描述

题目分析:

跑一遍最小生成树,输出最小生成树的边数和边的最大权值

Code:

#include <bits/stdc++.h>
using namespace std;
#define maxn 310
#define maxm 100010

int n,m,f[maxn];
struct node{
	int u,v,w;
}e[maxm];

inline int read_(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

inline void clean_(){
	for(int i=0;i<302;i++) f[i]=i;
}

inline bool cmp_(node aa,node bb){
	return aa.w<bb.w;
}

inline int find_(int x){
	if(f[x]==x) return x;
	else return f[x]=find_(f[x]);
}

inline void merge_(int x,int y){
	int rx=find_(x);
	int ry=find_(y);
	f[rx]=ry;
}

inline void ksul_(){
	int ans=0,size=0;
	for(int i=1;i<=m;i++){
		if(size==(n-1)){
			printf("%d %d",size,ans);
			exit(0);
		}
		if(find_(e[i].u)!=find_(e[i].v)){
			ans=max(ans,e[i].w);
			merge_(e[i].u,e[i].v);
			size++;
		}
	}
}
inline void init_(){
	freopen("scdushu.txt","r",stdin);
}

inline void readda_(){
	clean_();
	n=read_();m=read_();
	for(int i=1;i<=m;i++){
		e[i].u=read_();e[i].v=read_();e[i].w=read_();
	}
}

inline void work_(){
	sort(e+1,e+m+1,cmp_);
	ksul_();
}

int main(){
	init_();
	readda_();
	work_();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44574520/article/details/87606094