POJ2699 The Maximum Number of Strong Kings(最大流)
枚举所有Strong King的状态(最多1024种左右),然后判断是否合法。
判定合法用网络流,源点-比赛-人-汇点,这样连边。
源点向每场比赛连容量为1的边;
如果一场比赛,A和B,A是Strong King且A的胜场小于B那么这场比赛向A连容量1的边,否则这场比赛向A和B都连容量1的边;
每个人向汇点连容量为胜场的边。
最后如果最大流等于所有人胜场和那就是合法的一个解。
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #include<algorithm>
- using namespace std;
- #define MAXN 222
- #define MAXM 222*222*2
- #define INF (1<<30)
- struct Edge{
- int v,cap,flow,next;
- }edge[MAXM];
- int vs,vt,NE,NV;
- int head[MAXN];
- void addEdge(int u,int v,int cap){
- edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
- edge[NE].next=head[u]; head[u]=NE++;
- edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
- edge[NE].next=head[v]; head[v]=NE++;
- }
- int level[MAXN];
- int gap[MAXN];
- void bfs(){
- memset(level,-,sizeof(level));
- memset(gap,,sizeof(gap));
- level[vt]=;
- gap[level[vt]]++;
- queue<int> que;
- que.push(vt);
- while(!que.empty()){
- int u=que.front(); que.pop();
- for(int i=head[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(level[v]!=-) continue;
- level[v]=level[u]+;
- gap[level[v]]++;
- que.push(v);
- }
- }
- }
- int pre[MAXN];
- int cur[MAXN];
- int ISAP(){
- bfs();
- memset(pre,-,sizeof(pre));
- memcpy(cur,head,sizeof(head));
- int u=pre[vs]=vs,flow=,aug=INF;
- gap[]=NV;
- while(level[vs]<NV){
- bool flag=false;
- for(int &i=cur[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap!=edge[i].flow && level[u]==level[v]+){
- flag=true;
- pre[v]=u;
- u=v;
- //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
- aug=min(aug,edge[i].cap-edge[i].flow);
- if(v==vt){
- flow+=aug;
- for(u=pre[v]; v!=vs; v=u,u=pre[u]){
- edge[cur[u]].flow+=aug;
- edge[cur[u]^].flow-=aug;
- }
- //aug=-1;
- aug=INF;
- }
- break;
- }
- }
- if(flag) continue;
- int minlevel=NV;
- for(int i=head[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
- minlevel=level[v];
- cur[u]=i;
- }
- }
- if(--gap[level[u]]==) break;
- level[u]=minlevel+;
- gap[level[u]]++;
- u=pre[u];
- }
- return flow;
- }
- inline int in(int &ret){
- char c; ret=;
- while(c=getchar(),c<''||c>'') if(c=='\n'||c==EOF) return -;
- while(c>=''&&c<='') ret=ret*+c-'',c=getchar();
- if(c=='\n'||c==EOF) return ;
- return ;
- }
- int win[],n;
- bool isStatue(int s){
- for(int i=;i<n;++i){
- if((s>>i)&) continue;
- if(win[s]==win[n-]) return ;
- }
- return ;
- }
- int getCnt(int s){
- int cnt=;
- for(int i=;i<n;++i){
- if((s>>i)&) ++cnt;
- }
- return cnt;
- }
- int main(){
- int t;
- scanf("%d ",&t);
- while(t--){
- n=;
- int tmp;
- while(tmp=in(win[n]),tmp==) ++n;
- if(tmp==) ++n;
- int tot=;
- for(int i=; i<n; ++i) tot+=win[i];
- int res=;
- for(int s=; s<(<<n); ++s){
- if(!isStatue(s)) continue;
- memset(head,-,sizeof(head));
- vs=; vt=; NV=; NE=;
- for(int i=; i<n; ++i){
- addEdge(i+n*n,vt,win[i]);
- }
- for(int i=; i<n; ++i){
- for(int j=i+; j<n; ++j){
- addEdge(vs,i*n+j,);
- if(((s>>i)&) && win[i]<win[j]) addEdge(i*n+j,i+n*n,);
- else if(((s>>j)&) && win[j]<win[i]) addEdge(i*n+j,j+n*n,);
- else{
- addEdge(i*n+j,i+n*n,);
- addEdge(i*n+j,j+n*n,);
- }
- }
- }
- if(ISAP()==tot) res=max(res,getCnt(s));
- }
- printf("%d\n",res);
- }
- return ;
- }
POJ2699 The Maximum Number of Strong Kings(最大流)的更多相关文章
- POJ2699 The Maximum Number of Strong Kings
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2102 Accepted: 975 Description A tour ...
- POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
The Maximum Number of Strong Kings Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 ...
- POJ - 2699 The Maximum Number of Strong Kings (最大流+枚举)
题意:有n(n<=10)个选手,两两之间打比赛,共有n*(n-1)/2场比赛,赢一场得1分.给出每个人最后的得分.求有多少个定义如下的strong king:赢了所有得分比自己高的人或本身就是分 ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
- POJ 2699 The Maximum Number of Strong Kings Description
The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph ...
- 【POJ2699】The Maximum Number of Strong Kings(二分,最大流)
题意: 有n个队伍,两两都有比赛 知道最后每支队伍获胜的场数 求最多有多少队伍,他们战胜了所有获胜场数比自己多的队伍,这些队伍被称为SK N<=50 思路:把每个队伍和它们两两之间的比赛都当做点 ...
- 【poj2699】 The Maximum Number of Strong Kings
http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...
- The Maximum Number of Strong Kings
poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...
- 【POJ】【2699】The Maximum Number of Strong Kings
网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...
随机推荐
- Python列表基础
==========列表基础=========== 列表中的数据是可以被修改的.字典,元组,集合是不能被修改的. >>> li1=['3edf','dafdas'] >> ...
- Windows下tcp参数优化
Windows系统下的TCP参数优化2013-04-25 0 个评论 作者:最初的幸福ever收藏 我要投稿Windows系统下的TCP参数优化 TCP连接的状态与关闭方 ...
- HDU 1029 Ignatius and the Princess IV
解题报告: 题目大意:就是要求输入的N个数里面出现的次数最多的数是哪一个,水题.暴力可过,定义一个一位数组,先用memset函数初始化,然后每次输入一个数就将下标对应的上标对应的那个数加一,最后将整个 ...
- JQuery入门
JQuery入门 1 jQuery的概述 1.1 jQuery简介 jQuery是一个 JavaScript函数库,它是一个“写的更少,但做的更多”的轻量级 JavaScript 库.jQuery 极 ...
- nginx lua处理图片
user apache apache; worker_processes 4; worker_rlimit_nofile 100000; #error_log logs/error.log; #err ...
- php友好格式化时间
php格式化时间显示 function toTime($time) {//$time必须为时间戳 $rtime = date("Y-m-d H:i",$time); $htime ...
- c++11 gcc4.8.x安装
c++11 gcc4.8.x安装 2014年12月11日默北 要安装PHP-CPP,需要c++11,否则就会报错,错误信息如下所示: g++ -Wall -c -g -std=c++11 -fpi ...
- 【Network】一张图看懂 Reactor 与 Proactor 模型的区别
首先来看看Reactor模式,Reactor模式应用于同步I/O的场景.我们以读操作为例来看看Reactor中的具体步骤:读取操作:1. 应用程序注册读就需事件和相关联的事件处理器2. 事件分离器等待 ...
- 73 [面试题]交换一个整数的二进制表示的奇偶位(swapOddEvenBits)
[本文链接] http://www.cnblogs.com/hellogiser/p/swap-odd-even-bits.html [分析] 假定一个数字是8位数,设为ABCDEFGH ABCDEF ...
- 升级Windows10后Apache服务器启动失败的解决方法
升级windows10系统后,微软内置了ASP.NET的web高级服务,默认安装了IIS服务器和MSSQL数据库,因为80端口被占用的原因,导致Apache服务器无法正常启动,但是MySQL服务一切正 ...