Luogu P1525 关押罪犯

flag--
题目链接

思路#

不想写了。。一个二分答案+二分图染色的水题蓝题竟然写了我四十分钟

注意易错点:

1.因为我在染色时用的的是dfs,所以有冲突时不能简单的return而要用一个全局变量记录是否有过冲突

2.二分害人啊。。。多测几组数据吧

Code#

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int read()
{
	int f=1,a=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-f;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		a=a*10+ch-'0';
		ch=getchar();
	}
	return a*f;
}
struct node{
	int to,next,w;
}edge[MAXN];

int color[MAXN],head[MAXN];
int n,m,L,R,cnt,mid;
bool flag;
void addedge(int x,int y,int w)
{
	edge[++cnt].to=y;
	edge[cnt].w=w;
	edge[cnt].next=head[x];
	head[x]=cnt;
}

void dfs(int x,int col)
{
//	cout<<"x="<<x<<" col="<<col<<endl;
	color[x]=col;
	for(int i=head[x];i;i=edge[i].next){
		int y=edge[i].to;
		if(edge[i].w<=mid||color[y]==3-col)	continue;
		if(col==color[y]){
//			cout<<"fail1
";
			flag=1;
			return;
		}
		dfs(y,3-col);
		if(flag)	return;
	}
}

bool check()
{
	memset(color,0,sizeof(color)),flag=0;
	for(int i=1;i<=n;++i){
		if(color[i]==0){
			dfs(i,1);
			if(flag){
//				cout<<"fail2
";
				return 0;
			}
		}
	}
	return 1;
}

int main()
{
//	freopen("test.in","r",stdin);
//	freopen(".out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int a=read(),b=read(),c=read();
		R=max(R,c);
		addedge(a,b,c);
		addedge(b,a,c);
	}
	R++;
	while(L<R){
//		puts("midfind");
		mid=(L+R)>>1;		
//		cout<<L<<" "<<mid<<" "<<R<<endl;

		if(check()){
			R=mid;
		}else{
//			cout<<"fail3
";
			L=mid+1;
		}
	}
//	cout<<L<<" "<<mid<<" "<<R<<endl;
	cout<<L<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/zhu-chen/p/11610915.html