【POI2005】【BZOJ1532】Kos-Dicing
来源:互联网 发布:七天网络怎么查分 编辑:程序博客网 时间:2024/06/11 11:06
Description
Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的家伙,他想成为那个玩的最好的人,他现在知道了所有比赛的安排,他想知道,在最好的情况下,他最少只需要赢几场就可以赢得冠军,即他想知道比赛以后赢的最多的那个家伙最少会赢多少场.
Input
第一行两个整数n 和 m, 1 <= n <= 10 000, 0 <= m <= 10 000; n 表示一共有多少个参赛者, m 表示有多少场比赛. 选手从1 到 n编号. 接下来m 行每行两个整数表示该场比赛的两个选手,两个选手可能比赛多场.
Output
第一行表示赢得最多的人最少会赢多少场
Sample Input
4 4
1 2
1 3
1 4
1 2
Sample Output
1
HINT
Source
二分答案最大流判定
源点向每个人连答案流量的边
每个人向比赛连流量为1的边
比赛向汇点连流量为1的边
满流即可行
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#define MAXN 20010#define MAXM 2000010#define GET (ch>='0'&&ch<='9')#define MAXINT 0x3f3f3f3fusing namespace std;int n,m,ans,top;int u[MAXN],v[MAXN];int num[MAXN],dis[MAXN];int S,T;struct edge{ int to,c,f; edge *next,*rev;}e[MAXM],*prev[MAXN];void insert(int u,int v,int c,int f) { e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].c=c;e[top].f=f; }void add(int u,int v,int c){ insert(u,v,c,0);insert(v,u,0,c); prev[u]->rev=prev[v];prev[v]->rev=prev[u];}void in(int &x){ char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar();}void rebuild(int x){ memset(e,0,sizeof(edge)*(top+2));memset(prev,0,sizeof(edge*)*(n+m+2));top=0; for (int i=1;i<=n;i++) add(S,i,x); for (int i=1;i<=m;i++) add(u[i],i+n,1),add(v[i],i+n,1),add(i+n,T,1);}void init(){ queue<int> q;q.push(T); memset(dis,0x3f,sizeof(int)*(n+m+2));memset(num,0,sizeof(int)*(n+m+2));dis[T]=0;num[0]=1; while (!q.empty()) { int x=q.front();q.pop(); for (edge *i=prev[x];i;i=i->next) if ((i->rev&&i->rev->c==0)||(dis[i->to]<MAXINT)) {} else dis[i->to]=dis[x]+1,++num[dis[i->to]],q.push(i->to); }}int maxflow(){ int ret=0,st=S; edge *E[MAXN<<1],*rep[MAXN<<1]; for (int i=0;i<=n+m+1;i++) E[i]=prev[i]; while (dis[S]<n+m+2) { if (st==T) { int minn=MAXINT; for (int i=S;i!=T;i=E[i]->to) minn=min(minn,E[i]->c); for (int i=S;i!=T;i=E[i]->to) E[i]->c-=minn,E[i]->f+=minn,E[i]->rev->c+=minn,E[i]->rev->f-=minn; ret+=minn;st=S; } edge *i; for (i=E[st];i;i=i->next) if (i->c>0&&dis[st]==dis[i->to]+1) break; if (i) E[st]=i,rep[i->to]=i->rev,st=i->to; else { if ((--num[dis[st]])==0) break; E[st]=prev[st];int x=n+m+2; for (edge *I=prev[st];I;I=I->next) if (I->c>0) x=min(x,dis[I->to]); dis[st]=x+1;++num[dis[st]]; if (st!=S) st=rep[st]->to; } } return ret;}int main(){ in(n);in(m);int l=1,r=m,mid;S=0;T=n+m+1; for (int i=1;i<=m;i++) in(u[i]),in(v[i]); while (l<=r) { mid=(l+r)>>1;rebuild(mid); init();int tmp=maxflow(); if (tmp==m) r=mid-1,ans=mid; else l=mid+1; } printf("%d\n",ans);}
1 0
- bzoj1532 [POI2005]Kos-Dicing
- bzoj1532【POI2005】Kos-Dicing
- 【POI2005】【BZOJ1532】Kos-Dicing
- BZOJ1532: [POI2005]Kos-Dicing
- bzoj1532: [POI2005]Kos-Dicing
- 【bzoj1532】[POI2005]Kos-Dicing
- bzoj1532 [POI2005]Kos-Dicing
- bzoj1532 [POI2005]Kos-Dicing 最大流+二分
- [二分+最大流] BZOJ1532: [POI2005]Kos-Dicing
- [BZOJ1532][POI2005]Kos-Dicing(二分+最大流)
- bzoj1532 [POI2005]Kos-Dicing(二分+最大流)
- BZOJ1532/POI2005 Dicing
- [POI2005]Kos-Dicing
- 1532: [POI2005]Kos-Dicing
- 【BZOJ 1532】 [POI2005]Kos-Dicing
- BZOJ 1532 [POI2005]Kos-Dicing
- BZOJ 1532: [POI2005]Kos-Dicing|网络流
- 【BZOJ】【P1532】【POI2005】【Kos-Dicing】【二分+最大流】
- Android实现推送方式解决方案
- word2vec词向量训练及中文文本相似度计算
- HDU 1251 统计难题(字典树)
- usaco1.2 palsquare 2008.11.5
- usaco1.3 calfflac 2008.11.5
- 【POI2005】【BZOJ1532】Kos-Dicing
- U盘容量显示错误修改
- Codeforces Round #341 (Div. 2)D. Rat Kwesh and Cheese
- usaco1.3 crypt1 2008.11.5
- [9] CMake - 如何高效使用"cmake --help" ?
- JFFS2 及其新特性
- 龙星镖局 | 2015 机器学习颁奖礼
- Codeforces AIM Tech Round (Div. 2) A. Save Luke
- TCP/IP–http协议(http报文格式) .