刑事犯罪者の二分法図dfs

刑務所刑務所二部二部グラフdfs
問題解決

#include<iostream>
#include<algorithm>
#include<cstring>
#define INF 0x1f1f1f1f
using namespace std;
#include<vector>

int n,m;

int  cot[20005];

vector<pair<int,int>> p[20005];

bool dfs(int x,int col,int limit)
{
    
    
	cot[x]=col;
//	cout<<"顶点"<<x<<"被染成"<<col<<"颜色"<<endl; 
	for(int i=0;i<p[x].size();i++)
	{
    
    
		if(p[x][i].second<=limit)
			continue;
		if(cot[p[x][i].first]==col)   //如果下一顶点已经被染成相同的颜色  return 0 
		{
    
    
//			cout<<col<<endl;
//			cout<<p[x][i].first<<"的颜色为"<<cot[p[x][i].first]<<endl;
//			cout<<"顶点"<<x<<"邻接点"<<p[x][i].first<<"有问题"<<endl ;
			return 0;
		}
			
		if(cot[p[x][i].first]==0 )     
		{
    
    
			if(!dfs(p[x][i].first,-col,limit))    //如果下一个顶点未被染色,且dfs失败  return 0 
			{
    
    
//				cout<<"顶点"<<x<<"邻接点"<<p[x][i].first<<"有问题"<<endl; 
				return 0; 
			}
				
		}
			 		
	}
	
	return 1;
}


bool get(int limit)
{
    
    
	memset(cot,0,sizeof(cot));
	for(int i=1;i<=n;i++)
	{
    
    
		if(cot[i]==0)
		{
    
    
			if(!dfs(i,2,limit))
			{
    
    
//				cout<<i<<endl;
				return 0;
			}
				
		}
	}
	return 1;
}


int main()
{
    
    
	cin>>n>>m;
	int x,y;
	int len;
	for(int i=0;i<m;i++)
	{
    
    
		scanf("%d%d%d",&x,&y,&len);
		p[x].push_back({
    
    y,len});
		p[y].push_back({
    
    x,len});
	}
	
	
	int l=0;           //二分  [,) 
	int r=1e9+1;
	
	
	int mid;
	while(l<r)
	{
    
    
		mid=(l+r)>>1;
		
		if(get(mid))
		{
    
    
			r=mid;
		}else {
    
    
			l=mid+1;
		}
	}
	if(l==0)
	{
    
    
		cout<<0;
	}else {
    
    
		cout<<l;
	}
	
	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45448563/article/details/113755300