LG-P1525 关押罪犯

题目链接

从代码上看,这题就是 这题 的加强版吧,虽然思考过程有点不同。

这题,很显然就是求最小值最大,二分跳水。

#include
#include
#include
#include
using namespace std;
const int maxn=20006,maxm=100006<<1;
int n,m,tot,lnk[maxn],nxt[maxm],son[maxm],w[maxm],vis[maxn];
bool flg_;
int rad()
{
	int ret=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
	return ret*f;
}
void dfs(int x,int p,int mx)
{
	if (!flg_) return;
	if (vis[x]==-1) vis[x]=p;else
	{flg_=vis[x]==p;return;}
	int nxt_=p^1;
	for (int i=lnk[x];i>0&&flg_;i=nxt[i])
	  if (w[i]>mx) dfs(son[i],nxt_,mx);
}
void add(int z,int x,int y)
{
	son[++tot]=y;nxt[tot]=lnk[x];w[lnk[x]=tot]=z;
	son[++tot]=x;nxt[tot]=lnk[y];w[lnk[y]=tot]=z;
}
bool check_(int mx)
{
	flg_=true;
	for (int i=1;i<=n;++i) vis[i]=-1;
	for (int i=1;i<=n&&flg_;++i)
	  if (vis[i]==-1) dfs(i,0,mx);
	return flg_;
}
int main()
{
//	freopen("swap.in","r",stdin);
//	freopen("swap.out","w",stdout);
	n=rad();m=rad();
	for (int i=1;i<=m;++i) add(rad(),rad(),rad());
	int L=0,R=1e9,mid;
	while (L<=R)
	{
		mid=((R-L)>>1)+L;
		if (check_(mid)) R=mid-1;else L=mid+1;
	}
	printf("%d\n",L);
	return 0;
}

你可能感兴趣的:(日常小题,-,2018,二分,二分图染色)