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\n";
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\n";
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\n";
L=mid+1;
}
}
// cout<<L<<" "<<mid<<" "<<R<<endl;
cout<<L<<endl;
return 0;
}