关押罪犯洛谷P1525
2024-08-29 07:45:35
题目+评测传送门
思路
其实这一题有2种不同的思路,但是由于我实在是太蒟蒻了,只会其中一种,另一种看了半天都不知道它在讲什么/(ㄒoㄒ)/~~
首先,我们要学习一下二分图及其判断方法博客,然后这个题目就很好解决了,我们二分计算仇恨值,然后在如果2人仇恨值大于mid,我们就把他们相连,然后判断这个图是否是二分图,即在左右部分里面"没有冲突",而判断是否是二分图的方法,上面给的链接里面也讲了,然后这道题就OK啦
代码
#include<bits/stdc++.h>
#define FOR(i,a,b) for(register int i=a;i<=b;i++)
#define ll long long
#define gc getchar();
using namespace std;
int n,m,maxx=,num=,ans;
int head[+];
int colo[+];
struct s1
{
int fm,to,vl,nt;
}a[*+];
int scan()
{
int as=,f=;char c=gc;
while(c>''||c<''){if(c=='-') f=-;c=gc};
while(c>=''&&c<='') {as=(as<<)+(as<<)+c-'';c=gc};
return as*f;
}
void ad(int fm,int to,int vl)
{
a[++num].nt=head[fm];
a[num].fm=fm;a[num].to=to;a[num].vl=vl;
head[fm]=num;
}
bool chek(int mid)
{
memset(colo,,sizeof(colo));
queue <int> q;
FOR(i,,n)
{
if(colo[i]) continue;
q.push(i);colo[i]=;//如果没有进入,随便进入一个坑,反正之前的都
//已经解决完了
while(!q.empty())
{
int u=q.front(); q.pop();
for(int j=head[u];j;j=a[j].nt)
{
if(a[j].vl>=mid)
{
if(colo[a[j].to]==)
{
colo[a[j].to]=colo[u]==?:;//对立面的颜色
q.push(a[j].to);
}
else if(colo[a[j].to]==colo[u]) return false;
}
}
}
}
return true;
}
int main()
{
n=scan();m=scan();
FOR(i,,m)
{
int f,t,v;
f=scan();t=scan();v=scan();
maxx=max(v,maxx);
ad(f,t,v);ad(t,f,v);
}
int l=,r=maxx+;
while(l+<r)
{
int mid=(l+r)>>;
if(chek(mid)) r=mid;
else l=mid;
}
cout<<l;
return ;
}
最新文章
- Purfer Sequence
- C#编辑图像文件EXIF信息
- golang获取数据表转换为json通用方法
- Python实践:提取文章摘要
- 转载:JMS-ActiveMQ浅析
- form表单中的enctype属性什么意思?
- 【转】shell 教程——02 几种常见的Shell
- sql server 2008 创建新数据库报错、创建表报错、更改表的设计报错
- spring框架详解
- BZOJ 1058 报表统计 (STL)
- JS&;Java实现常见算法面试题
- 在 C 代码中嵌入 Python 语句或使用 Python 模块 (Visual Studio 2013 环境设置)
- 91. Reverse Linked List 反转链表
- JavaScript:几种常用循环
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
- System.IO.Path文件路径类
- idea问题总结记录
- spring-boot 速成(9) druid+mybatis 多数据源及读写分离的处理
- 第二阶段Sprint冲刺会议9
- Dubbo中多注册中心问题与服务分组