40分,用二分图写的,有无佬帮忙看看,谢谢啦
查看原帖
40分,用二分图写的,有无佬帮忙看看,谢谢啦
754444
tamamocross楼主2023/5/23 23:16
#include<iostream> 
#include<algorithm> 
#include<vector>
#include<cstring>
const int Max=1e5+1;
using namespace std;
int hatred[Max];
int color[Max];
struct ele{
		int to,weight;
		ele(int a,int b){
			to=a,weight=b;	
		}
	};
vector<ele> v[Max];
void add(int a,int b,int c){
	ele tmp(b,c);
	v[a].push_back(tmp);
}
int Mid;
void print(int n){
	for(int i=1;i<=n;i++){
		cout<<color[i]<<" ";
	}
	cout<<endl;
}
bool dfs(int n,int c){
	//print(4);
	color[n]=c;
	//print(4);
	for(auto it=v[n].begin();it!=v[n].end();it++){
		if((*it).weight>hatred[Mid]){
		//	cout<<n<<(*it).to<<endl;
			if(color[(*it).to]==0){
			dfs((*it).to,3-c);
		}else{	
			if(color[(*it).to]==c){
				return false;
				}	
			} 
		}
	}
	return true;
}
int main(){
	int n,m;
	cin>>n>>m;
	int a,b,c;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
		hatred[i]=c;
	}
	sort(hatred,hatred+1+m);
	int l=0,r=m;
	while(l!=r){
		Mid=(l+r)/2;
	//	cout<<l<<" "<<r<<" "<<hatred[Mid]<<endl;
		memset(color,0,sizeof(color));
		bool flag=false;
		for(int i=1;i<=n;i++){
			if(color[i]==0){
				//cout<<114;
				if(!dfs(i,1)){	
					flag=true;
					break;
				}
			}
		}
		//print(n);
		if(!flag){
			r=Mid;
		}else{
			l=Mid+1;
		}
		//cout<<l<<" "<<r<<endl;
	}
	Mid=(l+r)/2;
	cout<<hatred[Mid];
}/*
2 1
1 2 28135
*/
2023/5/23 23:16
加载中...