The Maximum Number of Strong Kings

poj2699:http://poj.org/problem?id=2699

题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分。如果一个人打败了所有比他分数高的对手,或者他就是分数最高的,那么他就是strong kind。现在给你每个人的得分,问你最多有多少个strong kind。

题解:自己没有思路,看了别人的题解,才勉强理解了。首先,肯定让得分高的成为strong king,因为概率比较大,然后就是怎建图了。假如,我们已经知道了,有m个strong kind,那么这m个人一定是后m个,所以,我们只要判断这m个是否满足条件就可以了,由于n很小,所以可以直接枚举ans。接下来就是建图,人作为一个点,与s建立一边,容量就是得分,然后比赛作为一种点,和t连接,容量是1,然后开始枚举ans,对于后ans个人来说,每个人i对于比他分高的选手j,都必须赢,所以对于i,j之间的比赛,i必须赢,所以i--mp[i][j](表示ij之间比赛的编号)建立一边,容量是1,然后对于剩余的比赛来说,i,j都可以赢,所以i,j都要建立一边到mp[i][j]容量是1,然后跑网络流,如果跑出的maxflow==n*(n-1)/2,说明这种方式是满足的,直接输出就可以了。这一题的读入不是很规范,数字之间不是严格的一个空格,可能有多个空格。

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<queue>
  6 #include<string>
  7 #define INF 100000000
  8 using namespace std;
  9 const int N=125;
 10 const int M=500;
 11 struct Node{
 12    int v;
 13    int f;
 14    int next;
 15 }edge[M];
 16 int n,m,u,v,tt,cnt,sx,ex;
 17 int head[125],pre[125];
 18 int g[12],f[N],mp[12][12];//根据题目要求申请
 19 void init(){
 20     cnt=0;
 21     memset(head,-1,sizeof(head));
 22     memset(f,0,sizeof(f));
 23 }
 24 void add(int u,int v,int w){
 25     edge[cnt].v=v;
 26     edge[cnt].f=w;
 27     edge[cnt].next=head[u];
 28     head[u]=cnt++;
 29     edge[cnt].f=0;
 30     edge[cnt].v=u;
 31     edge[cnt].next=head[v];
 32     head[v]=cnt++;
 33 }
 34 bool BFS(){
 35   memset(pre,0,sizeof(pre));
 36   pre[sx]=1;
 37   queue<int>Q;
 38   Q.push(sx);
 39  while(!Q.empty()){
 40      int d=Q.front();
 41      Q.pop();
 42      for(int i=head[d];i!=-1;i=edge[i].next    ){
 43         if(edge[i].f&&!pre[edge[i].v]){
 44             pre[edge[i].v]=pre[d]+1;
 45             Q.push(edge[i].v);
 46         }
 47      }
 48   }
 49  return pre[ex]>0;
 50 }
 51 int dinic(int flow,int ps){
 52     int f=flow;
 53      if(ps==ex)return f;
 54      for(int i=head[ps];i!=-1;i=edge[i].next){
 55         if(edge[i].f&&pre[edge[i].v]==pre[ps]+1){
 56             int a=edge[i].f;
 57             int t=dinic(min(a,flow),edge[i].v);
 58               edge[i].f-=t;
 59               edge[i^1].f+=t;
 60             flow-=t;
 61              if(flow<=0)break;
 62         }
 63
 64      }
 65       if(f-flow<=0)pre[ps]=-1;
 66       return f-flow;
 67 }
 68 int solve(){
 69     int sum=0;
 70     while(BFS())
 71         sum+=dinic(INF,sx);
 72     return sum;
 73 }
 74 void build(int num){
 75     init();
 76    for(int i=1;i<=n;i++)
 77       add(0,i,g[i]);
 78    for(int i=1;i<=tt;i++)
 79       add(i+n,n+tt+1,1);
 80    for(int i=n-num+1;i<=n;i++)
 81    for(int j=i+1;j<=n;j++){
 82       if(g[j]>g[i]){
 83          f[mp[i][j]]=1;
 84          add(i,mp[i][j]+n,1);
 85       }
 86    }
 87    for(int i=1;i<=n;i++)
 88    for(int j=i+1;j<=n;j++){
 89        if(!f[mp[i][j]]){
 90           add(i,mp[i][j]+n,1);
 91           add(j,mp[i][j]+n,1);
 92        }
 93    }
 94 }
 95 string str;
 96 int main() {
 97     int T;
 98     scanf("%d",&T);
 99      getchar();
100     while(T--) {
101           n=0;
102           getline(cin,str);
103           int len=str.length();
104           for(int i=0;i<len;i++){
105             if(str[i]>=‘0‘&&str[i]<=‘9‘)
106                 g[++n]=str[i]-‘0‘;
107           }
108          tt=0;
109          for(int i=1;i<=n;i++)
110             for(int j=i+1;j<=n;j++)
111                 mp[i][j]=++tt;
112        sx=0,ex=n+tt+1;
113        int i;
114        for(i=n;i>1;i--){
115           build(i);
116           if(solve()==tt)break;
117        }
118        printf("%d\n",i);
119     }
120     return 0;
121 }

时间: 2024-11-09 21:53:06

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 tournament can be represented by a complete graph in which each vertex denotes a player and a directed edge is from vertex x to vertex y if player x beats

【POJ2699】The Maximum Number of Strong Kings

Description A tournament can be represented by a complete graph in which each vertex denotes a player and a directed edge is from vertex x to vertex y if player x beats player y. For a player x in a tournament T, the score of x is the number of playe

POJ2699_The Maximum Number of Strong Kings

这题目,,,真是...诶.坑了好久. 给一个有向图.U->V表示U可以打败V并得一分. 如果一个人的得分最高,或者他打败所有比自己得分高的人,那么此人就是king. 现在给出每个人的得分,求最多可能有多少个king同时存在. 可以证明,如果有k个人是king,那么至少有一种分配方案使得这k个king都是分数最高的那k个人.(证明略,想想就知道了) 于是我们可以开始枚举从i个人开始,后面的都是king. 除了源点和汇点以外,还有两种点,一种表示人(n),一种表示比赛(n*(n/2)/2). 如果一

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 in which each vertex denotes a player and a directed edge is from vertex x to vertex y if player x beats player y. For a player x in a tournament T, th

解题报告 之 POJ2699 The Maximum Number of Strong Kings

解题报告 之 POJ2699 The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph in which each vertex denotes a player and a directed edge is from vertex x to vertex y if player x beats player y. For a player x in a t

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

网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一定是胜场较多的队伍……(比他赢得多的队伍num少,而他总共赢得场数times足够多,至少得满足times>=num吧?) 那么我们可以二分/枚举k,表示胜场前k多的队伍是stong king.(这题范围小,只有10支队伍,如果队伍较多我们就需要二分了……) 最最丧心病狂的是!!!出题人TMD卡读入!

【POJ2699】The Maximum Number of Strong Kings 枚举(二分)+网络流check、

题意: 有n个人,两两都有比赛,然后有每个人的胜场次数. 规定把比自己胜场次数多的人都赢了的就是strong(weak) king (vegetables) (why i say that they are so weak? :****,how do you think a person who beat the heroes but defeated at the dogface? ) 让你安排比赛,问最多有多少个strongking? 题解: 首先(有人说)能证如果有k个sk,那么一定可以是

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

http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v打败u.一个选手的得分等于被他打败的选手总数.一个选手被称为“strong king”当且仅当他打败了所有比他分高的选手.分数最高的选手也是strong king.现在给出某场联赛所有选手的得分序列,由低到高,问合理安排每场比赛的结果后最多能有几个strong king.已知选手总数不超过10个.

【poj2699】 The Maximum Number of Strong Kings

http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么此人就是king.现在按顺序给出每个人的得分,求最多可能有多少个king同时存在. Solution 想了半天贪心,然而得分相等的情况真的很不好处理..真的没想到是最大流..左转题解:http://blog.csdn.net/sdj222555/article/details/7797257 考虑这样建图