1. 程式人生 > 其它 >關押罪犯 二分 二分圖 dfs

關押罪犯 二分 二分圖 dfs

技術標籤:二分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; }