P1525 關押罪犯 並查集

 題意:將一些人分成兩部分,m條x與y之間有w的值,求分配後的最大的值儘量小。注意沒有輸出0

貪心,並查集

#include <bits/stdc++.h>
using namespace std;
const int maxn = 20005;
struct N{
	int x,y,z;
}no[100005]; 
bool cmp(N c,N d){
	return c.z>d.z;
}
int n,m;
int fa[maxn],ar[maxn];
inline int getf(int x){
	if(fa[x]==x)return fa[x];
	else {
		fa[x] = getf(fa[x]);
		return fa[x];
	}
}
inline int check(int x,int y){
	int t1 = getf(x);
	int t2 = getf(y);
	if(t1==t2)return 1;
	else return 0;
}
inline void add(int x,int y){
	int t1 = getf(x);
	int t2 = getf(y);
	fa[t1] = t2; 
} 
int main()
{
	scanf("%d %d",&n,&m);	
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&no[i].x,&no[i].y,&no[i].z);
	}
	sort(no+1,no+1+m,cmp);
	for(int i=1;i<=n;i++)fa[i] = i;
	for(int i=1;i<=m;i++){
		if(check(no[i].x,no[i].y)){printf("%d\n",no[i].z);return 0;
		}else{
			if(!ar[no[i].x])ar[no[i].x] = no[i].y; 
			else add(ar[no[i].x],no[i].y);//敵人的敵人進入一個監獄 
			if(!ar[no[i].y])ar[no[i].y] = no[i].x;
			else add(ar[no[i].y],no[i].x);
		}
	} 
	printf("0\n");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章