洛谷P1525关押罪犯——二分做法
2024-10-20 05:28:53
题目:https://www.luogu.org/problemnew/show/P1525
二分答案,二分图染色判断是否可行。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,ct,head[20005],ans,mx,mid;
bool col[20005],vis[20005];
struct N{
int to,next,w;
}edge[200005];
void add(int x,int y,int z)
{
ct++;
edge[ct].to=y;
edge[ct].next=head[x];
edge[ct].w=z;
head[x]=ct;
}
bool dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(edge[i].w<=mid)continue;
if(!vis[u])
{
col[u]=!col[x];
vis[u]=1;
if(dfs(u))return 1;
}
else if(vis[u]&&col[u]==col[x])return 1;
}
return 0;
}
void per(int l,int r)
{
if(l>=r)//=!
{
ans=l;
return;
}
memset(col,0,sizeof col);
memset(vis,0,sizeof vis);
mid=(l+r)/2;
bool flag=0;
for(int i=1;i<=n;i++)
if(!vis[i])
{
vis[i]=1;col[i]=1;
if(dfs(i))
{
flag=1;
break;
}
}
if(flag)per(mid+1,r);
else per(l,mid);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);//无向边
mx=max(mx,z);
}
per(0,mx);
printf("%d",ans);
return 0;
}
最新文章
- TinkPad E40 CentOS 6.5 无线网卡驱动 RTL8191SEvB 安装
- Lambda 表达式[MSDN]
- 配置ntp服务
- ModuleWorks免费下载使用方法大全
- form表单 无法提交js动态添加的表单元素问题。。
- scala知识点(一)
- 04斐波那契函数_Fibonacci--(栈与队列)
- 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&;rails on ruby
- HW5.17
- vijosP1067Warcraft III 守望者的烦恼
- python——BS解析器
- hdu 2051 Bitset (java)
- 批处理删除IIS的everyone、users的访问权限
- 【转载】JavaScript继承详解(二)
- Chrome 开发者工具断点调试(视频教程)
- 数据攻略●R语言自述
- BBS+Blog项目开发
- 53-java中的queue
- P1914 一串字母
- LIght OJ 1179