枚举所有Strong King的状态(最多1024种左右),然后判断是否合法。

判定合法用网络流,源点-比赛-人-汇点,这样连边。

源点向每场比赛连容量为1的边;

如果一场比赛,A和B,A是Strong King且A的胜场小于B那么这场比赛向A连容量1的边,否则这场比赛向A和B都连容量1的边;

每个人向汇点连容量为胜场的边。

最后如果最大流等于所有人胜场和那就是合法的一个解。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 222
  7. #define MAXM 222*222*2
  8. #define INF (1<<30)
  9.  
  10. struct Edge{
  11. int v,cap,flow,next;
  12. }edge[MAXM];
  13. int vs,vt,NE,NV;
  14. int head[MAXN];
  15.  
  16. void addEdge(int u,int v,int cap){
  17. edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
  18. edge[NE].next=head[u]; head[u]=NE++;
  19. edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
  20. edge[NE].next=head[v]; head[v]=NE++;
  21. }
  22.  
  23. int level[MAXN];
  24. int gap[MAXN];
  25. void bfs(){
  26. memset(level,-,sizeof(level));
  27. memset(gap,,sizeof(gap));
  28. level[vt]=;
  29. gap[level[vt]]++;
  30. queue<int> que;
  31. que.push(vt);
  32. while(!que.empty()){
  33. int u=que.front(); que.pop();
  34. for(int i=head[u]; i!=-; i=edge[i].next){
  35. int v=edge[i].v;
  36. if(level[v]!=-) continue;
  37. level[v]=level[u]+;
  38. gap[level[v]]++;
  39. que.push(v);
  40. }
  41. }
  42. }
  43.  
  44. int pre[MAXN];
  45. int cur[MAXN];
  46. int ISAP(){
  47. bfs();
  48. memset(pre,-,sizeof(pre));
  49. memcpy(cur,head,sizeof(head));
  50. int u=pre[vs]=vs,flow=,aug=INF;
  51. gap[]=NV;
  52. while(level[vs]<NV){
  53. bool flag=false;
  54. for(int &i=cur[u]; i!=-; i=edge[i].next){
  55. int v=edge[i].v;
  56. if(edge[i].cap!=edge[i].flow && level[u]==level[v]+){
  57. flag=true;
  58. pre[v]=u;
  59. u=v;
  60. //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
  61. aug=min(aug,edge[i].cap-edge[i].flow);
  62. if(v==vt){
  63. flow+=aug;
  64. for(u=pre[v]; v!=vs; v=u,u=pre[u]){
  65. edge[cur[u]].flow+=aug;
  66. edge[cur[u]^].flow-=aug;
  67. }
  68. //aug=-1;
  69. aug=INF;
  70. }
  71. break;
  72. }
  73. }
  74. if(flag) continue;
  75. int minlevel=NV;
  76. for(int i=head[u]; i!=-; i=edge[i].next){
  77. int v=edge[i].v;
  78. if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
  79. minlevel=level[v];
  80. cur[u]=i;
  81. }
  82. }
  83. if(--gap[level[u]]==) break;
  84. level[u]=minlevel+;
  85. gap[level[u]]++;
  86. u=pre[u];
  87. }
  88. return flow;
  89. }
  90.  
  91. inline int in(int &ret){
  92. char c; ret=;
  93. while(c=getchar(),c<''||c>'') if(c=='\n'||c==EOF) return -;
  94. while(c>=''&&c<='') ret=ret*+c-'',c=getchar();
  95. if(c=='\n'||c==EOF) return ;
  96. return ;
  97. }
  98.  
  99. int win[],n;
  100. bool isStatue(int s){
  101. for(int i=;i<n;++i){
  102. if((s>>i)&) continue;
  103. if(win[s]==win[n-]) return ;
  104. }
  105. return ;
  106. }
  107. int getCnt(int s){
  108. int cnt=;
  109. for(int i=;i<n;++i){
  110. if((s>>i)&) ++cnt;
  111. }
  112. return cnt;
  113. }
  114.  
  115. int main(){
  116. int t;
  117. scanf("%d ",&t);
  118. while(t--){
  119. n=;
  120. int tmp;
  121. while(tmp=in(win[n]),tmp==) ++n;
  122. if(tmp==) ++n;
  123.  
  124. int tot=;
  125. for(int i=; i<n; ++i) tot+=win[i];
  126.  
  127. int res=;
  128. for(int s=; s<(<<n); ++s){
  129. if(!isStatue(s)) continue;
  130. memset(head,-,sizeof(head));
  131. vs=; vt=; NV=; NE=;
  132. for(int i=; i<n; ++i){
  133. addEdge(i+n*n,vt,win[i]);
  134. }
  135. for(int i=; i<n; ++i){
  136. for(int j=i+; j<n; ++j){
  137. addEdge(vs,i*n+j,);
  138. if(((s>>i)&) && win[i]<win[j]) addEdge(i*n+j,i+n*n,);
  139. else if(((s>>j)&) && win[j]<win[i]) addEdge(i*n+j,j+n*n,);
  140. else{
  141. addEdge(i*n+j,i+n*n,);
  142. addEdge(i*n+j,j+n*n,);
  143. }
  144. }
  145. }
  146. if(ISAP()==tot) res=max(res,getCnt(s));
  147. }
  148. printf("%d\n",res);
  149. }
  150. return ;
  151. }

POJ2699 The Maximum Number of Strong Kings(最大流)的更多相关文章

  1. POJ2699 The Maximum Number of Strong Kings

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2102   Accepted: 975 Description A tour ...

  2. POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)

    The Maximum Number of Strong Kings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2488 ...

  3. POJ - 2699 The Maximum Number of Strong Kings (最大流+枚举)

    题意:有n(n<=10)个选手,两两之间打比赛,共有n*(n-1)/2场比赛,赢一场得1分.给出每个人最后的得分.求有多少个定义如下的strong king:赢了所有得分比自己高的人或本身就是分 ...

  4. 【POJ2699】The Maximum Number of Strong Kings(网络流)

    Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...

  5. 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 ...

  6. 【POJ2699】The Maximum Number of Strong Kings(二分,最大流)

    题意: 有n个队伍,两两都有比赛 知道最后每支队伍获胜的场数 求最多有多少队伍,他们战胜了所有获胜场数比自己多的队伍,这些队伍被称为SK N<=50 思路:把每个队伍和它们两两之间的比赛都当做点 ...

  7. 【poj2699】 The Maximum Number of Strong Kings

    http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...

  8. The Maximum Number of Strong Kings

    poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...

  9. 【POJ】【2699】The Maximum Number of Strong Kings

    网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...

随机推荐

  1. Python列表基础

    ==========列表基础=========== 列表中的数据是可以被修改的.字典,元组,集合是不能被修改的. >>> li1=['3edf','dafdas'] >> ...

  2. Windows下tcp参数优化

    Windows系统下的TCP参数优化2013-04-25      0 个评论       作者:最初的幸福ever收藏     我要投稿Windows系统下的TCP参数优化 TCP连接的状态与关闭方 ...

  3. HDU 1029 Ignatius and the Princess IV

    解题报告: 题目大意:就是要求输入的N个数里面出现的次数最多的数是哪一个,水题.暴力可过,定义一个一位数组,先用memset函数初始化,然后每次输入一个数就将下标对应的上标对应的那个数加一,最后将整个 ...

  4. JQuery入门

    JQuery入门 1 jQuery的概述 1.1 jQuery简介 jQuery是一个 JavaScript函数库,它是一个“写的更少,但做的更多”的轻量级 JavaScript 库.jQuery 极 ...

  5. nginx lua处理图片

    user apache apache; worker_processes 4; worker_rlimit_nofile 100000; #error_log logs/error.log; #err ...

  6. php友好格式化时间

    php格式化时间显示 function toTime($time) {//$time必须为时间戳 $rtime = date("Y-m-d H:i",$time); $htime ...

  7. 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 ...

  8. 【Network】一张图看懂 Reactor 与 Proactor 模型的区别

    首先来看看Reactor模式,Reactor模式应用于同步I/O的场景.我们以读操作为例来看看Reactor中的具体步骤:读取操作:1. 应用程序注册读就需事件和相关联的事件处理器2. 事件分离器等待 ...

  9. 73 [面试题]交换一个整数的二进制表示的奇偶位(swapOddEvenBits)

    [本文链接] http://www.cnblogs.com/hellogiser/p/swap-odd-even-bits.html [分析] 假定一个数字是8位数,设为ABCDEFGH ABCDEF ...

  10. 升级Windows10后Apache服务器启动失败的解决方法

    升级windows10系统后,微软内置了ASP.NET的web高级服务,默认安装了IIS服务器和MSSQL数据库,因为80端口被占用的原因,导致Apache服务器无法正常启动,但是MySQL服务一切正 ...