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,说明这种方式是满足的,直接输出就可以了。这一题的读入不是很规范,数字之间不是严格的一个空格,可能有多个空格。

 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<string>
#define INF 100000000
using namespace std;
const int N=;
const int M=;
struct Node{
int v;
int f;
int next;
}edge[M];
int n,m,u,v,tt,cnt,sx,ex;
int head[],pre[];
int g[],f[N],mp[][];//根据题目要求申请
void init(){
cnt=;
memset(head,-,sizeof(head));
memset(f,,sizeof(f));
}
void add(int u,int v,int w){
edge[cnt].v=v;
edge[cnt].f=w;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].f=;
edge[cnt].v=u;
edge[cnt].next=head[v];
head[v]=cnt++;
}
bool BFS(){
memset(pre,,sizeof(pre));
pre[sx]=;
queue<int>Q;
Q.push(sx);
while(!Q.empty()){
int d=Q.front();
Q.pop();
for(int i=head[d];i!=-;i=edge[i].next ){
if(edge[i].f&&!pre[edge[i].v]){
pre[edge[i].v]=pre[d]+;
Q.push(edge[i].v);
}
}
}
return pre[ex]>;
}
int dinic(int flow,int ps){
int f=flow;
if(ps==ex)return f;
for(int i=head[ps];i!=-;i=edge[i].next){
if(edge[i].f&&pre[edge[i].v]==pre[ps]+){
int a=edge[i].f;
int t=dinic(min(a,flow),edge[i].v);
edge[i].f-=t;
edge[i^].f+=t;
flow-=t;
if(flow<=)break;
} }
if(f-flow<=)pre[ps]=-;
return f-flow;
}
int solve(){
int sum=;
while(BFS())
sum+=dinic(INF,sx);
return sum;
}
void build(int num){
init();
for(int i=;i<=n;i++)
add(,i,g[i]);
for(int i=;i<=tt;i++)
add(i+n,n+tt+,);
for(int i=n-num+;i<=n;i++)
for(int j=i+;j<=n;j++){
if(g[j]>g[i]){
f[mp[i][j]]=;
add(i,mp[i][j]+n,);
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
if(!f[mp[i][j]]){
add(i,mp[i][j]+n,);
add(j,mp[i][j]+n,);
}
}
}
string str;
int main() {
int T;
scanf("%d",&T);
getchar();
while(T--) {
n=;
getline(cin,str);
int len=str.length();
for(int i=;i<len;i++){
if(str[i]>=''&&str[i]<='')
g[++n]=str[i]-'';
}
tt=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
mp[i][j]=++tt;
sx=,ex=n+tt+;
int i;
for(i=n;i>;i--){
build(i);
if(solve()==tt)break;
}
printf("%d\n",i);
}
return ;
}

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

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

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

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

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

  5. POJ2699 The Maximum Number of Strong Kings(最大流)

    枚举所有Strong King的状态(最多1024种左右),然后判断是否合法. 判定合法用网络流,源点-比赛-人-汇点,这样连边. 源点向每场比赛连容量为1的边: 如果一场比赛,A和B,A是Stron ...

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

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

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

    http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v ...

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

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

  9. 「POJ 2699」The Maximum Number of Strong Kings

    题目链接 戳我 \(Describe\) 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边\((u, v)\)或\((v, u)\),表示\(u\)打败\(v\)或 ...

随机推荐

  1. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法 一.C ...

  2. android线程与线程池-----线程池(二)《android开发艺术与探索》

    android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的 ...

  3. 【原】window上安装elasticserach

    [window上安装elasticserach] 系统环境:2008R2 x64测试安装用的服务器IP:192.168.12.52elasticsearch版本:2.3.4JDK版本:jdk 1.8. ...

  4. RedHat搭建IPA-Server

    ipa-server是红帽身份验证的一个完整解决方案,上游的开源项目是freeIPA,它本身不提供具体功能,而是整合了389-ds.ipa-server-dns.krb5-server等核心软件包,形 ...

  5. sendkeys && appactivate

    sendkeys    用于输入键盘按键 appactivate 用于聚焦程序 on error resume next set ws = createObject("wscript.she ...

  6. Lucene.net项目研究说明

    最近项目需要全文检索,所以找了几个开源的.NET检索项目,如:Lucene.net,Sphinx,Hubble.net.最后选择使用Lucene.ne来实现全文检索.至于原因嘛,可以参考下面几点: 1 ...

  7. hibernate - Transaction not successfully started

    今天在测试 transaction(使用事务进行管理)的时候, 总报错: Transaction not successfully started 可能有多种原因, 这位哥们总结得很好: Transa ...

  8. 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码

    在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...

  9. Javascript实现图片库效果

    思路: 无序列表加载图片文件.用img标签加载一张图片作为占位符.当点击照片链接时,改变<a>元素的href属性.并且阻止浏览器的默认行为. 动态改变描述文字,在图片下方增加P标签.通过获 ...

  10. CSS3 文本装饰

    浏览器对CSS3文本特性的支持情况,如下表所示: 浏览器 text-shadow text-overflow word-wrap hyphens Opera 9.5+ 9+.带前缀-o- 10.5+ ...