题意:

有n个队伍,两两都有比赛

知道最后每支队伍获胜的场数

求最多有多少队伍,他们战胜了所有获胜场数比自己多的队伍,这些队伍被称为SK

N<=50

思路:把每个队伍和它们两两之间的比赛都当做点,判断最大流是否满流即可

S——>队伍 a[i]

队伍 ——>比赛 1

比赛——>T 1

i号队伍是SK:如果j为SK且a[i]>a[j]则j必胜,如果a[i]<a[j]则i必胜 只要必胜者向他们之间的比赛连1条边即可

如果j不为SK,胜负未知,两个点都向他们之间的比赛连1条边

i号队伍不是SK:对于所有的队伍都胜负未知,同上处理

最暴力的思想就是枚举每个队伍作为SK的可能性再根据得分情况连边,其实也能过

不过可以证明一定存在一种方案,使得SK是排序后得分最多的那些队伍

二分或枚举答案即可

证明见http://blog.csdn.net/sdj222555/article/details/7797257

 var head,a:array[..]of longint;
fan:array[..]of longint;
vet,next,len,dis,gap,flag:array[..]of longint;
num:array[..,..]of longint;
n,i,j,tot,l,r,mid,last,s,source,src,cas,v,k:longint;
ch:ansistring; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure add(a,b,c:longint);
begin inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot; inc(tot);
next[tot]:=head[b];
vet[tot]:=a;
len[tot]:=;
head[b]:=tot; end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=a[(l+r)>>];
repeat
while mid<a[i] do inc(i);
while mid>a[j] do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function dfs(u,aug:longint):longint;
var e,v,t,val,flow:longint;
begin
if u=src then exit(aug);
e:=head[u]; val:=s-; flow:=;
while e<> do
begin
v:=vet[e];
if len[e]> then
begin
if dis[u]=dis[v]+ then
begin
t:=dfs(v,min(len[e],aug-flow));
len[e]:=len[e]-t;
len[fan[e]]:=len[fan[e]]+t;
flow:=flow+t;
if dis[source]>=s then exit(flow);
if aug=flow then break;
end;
val:=min(val,dis[v]);
end;
e:=next[e];
end;
if flow= then
begin
dec(gap[dis[u]]);
if gap[dis[u]]= then dis[source]:=s;
dis[u]:=val+;
inc(gap[dis[u]]);
end;
exit(flow);
end; function maxflow:longint;
var ans:longint;
begin
fillchar(gap,sizeof(gap),);
fillchar(dis,sizeof(dis),);
gap[]:=s; ans:=;
while dis[source]<s do ans:=ans+dfs(source,maxlongint);
exit(ans);
end; procedure build(k:longint);
var i,j:longint;
begin
fillchar(flag,sizeof(flag),);
fillchar(head,sizeof(head),); tot:=; for i:= to k do
begin
for j:= to i- do
begin
flag[num[i,j]]:=;
add(i,num[i,j],);
end;
for j:=i+ to n do
if (a[j]<a[i])and(j<=k)and(flag[num[i,j]]=) then
begin
flag[num[i,j]]:=;
add(j,num[i,j],);
end
else if flag[num[i,j]]= then
begin
flag[num[i,j]]:=;
add(i,num[i,j],);
add(j,num[i,j],);
end;
end;
for i:=k+ to n do
for j:= to n do
if (i<>j)and(flag[num[i,j]]=) then
begin
add(i,num[i,j],);
add(j,num[i,j],);
flag[num[i,j]]:=;
end;
for i:= to n do add(source,i,a[i]);
for i:= to n do
for j:= to n do
if i<j then add(num[i,j],src,);
end; function isok(k:longint):boolean;
begin
if maxflow=n*(n-) div then exit(true);
exit(false);
end; begin
assign(input,'poj2699.in'); reset(input);
assign(output,'poj2699.out'); rewrite(output);
for i:= to do
if i mod = then fan[i]:=i+
else fan[i]:=i-;
readln(cas);
for v:= to cas do
begin
fillchar(num,sizeof(num),);
readln(ch); k:=length(ch);
fillchar(a,sizeof(a),); n:=;
i:=;
while i<k do
begin
inc(i);
while (i<k)and(ch[i]=' ') do inc(i);
inc(n);
while (i<=k)and(ch[i]<>' ') do
begin
a[n]:=a[n]*+ord(ch[i])-ord('');
inc(i);
end;
end; qsort(,n); s:=n;
for i:= to n do
for j:= to n do
if i<>j then
begin
if num[j,i]= then
begin
inc(s); num[i,j]:=s;
end
else num[i,j]:=num[j,i];
end;
inc(s); source:=s; inc(s); src:=s; l:=; r:=n; last:=;
while l<=r do
begin
mid:=(l+r)>>;
build(mid);
if isok(mid) then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
writeln(last);
end;
close(input);
close(output);
end.

【POJ2699】The Maximum Number of Strong Kings(二分,最大流)的更多相关文章

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

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

  2. POJ2699 The Maximum Number of Strong Kings

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

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

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

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

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

  5. poj 2699 The Maximum Number of Strong Kings 枚举 最大流

    题目链接 题意 对于一个竞赛图(有向完全图),其顶点是选手,边是比赛,边\(e=(u,v)\)代表该场比赛中\(u\)战胜\(v\). 现定义选手的分数为其战胜的人的个数(即竞赛图中点的出度).并且定 ...

  6. poj 2699 The Maximum Number of Strong Kings【最大流+枚举】

    因为n很小所以从大到小枚举答案.(从小到大先排个序,因为显然胜利场次越多越容易成为strong king.然后对于每个枚举出来的ans建图.点分别表示人和比赛.s向所有人连接流量为胜利场次的边,所有比 ...

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

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

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

  9. 【poj2699】 The Maximum Number of Strong Kings

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

随机推荐

  1. Django 后台管理设置(admin.py)

    上面是两种后台效果图,第一张是默认情况下Django的后台,第二张是稍作修改后的情况,下面记录下作了哪些修改: 代码: class ArticleAdmin(admin.ModelAdmin): li ...

  2. 使用VS2013逆向生成UML类图

    引自http://blog.csdn.net/funnyfu0101/article/details/7705173 首先.打开工程,[体系结构]->[新建关系图] 生成一个类图 然后[体系结构 ...

  3. C语言获得文件一行

    C语言获得一行的数据还是比较麻烦的,这里讲一下几种曾经用过的方法. 第一种,是最笨的方法,就是一个一个字符的读取,也是最容易想到的方法.具体实现如下:void   read_line(char   l ...

  4. 【转载】彻底卸载MYSQL的方法

    1.控制面板里的增加删除程序内进行删除 2.删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 3.开始->运行-> regedit 看看注册表里这几个地方删除 ...

  5. 第一章 Andorid系统移植与驱动开发概述 - 读书笔记

    Android驱动月考1 第一章 Andorid系统移植与驱动开发概述 - 读书笔记 1.Android系统的架构: (1)Linux内核,Android是基于Linux内核的操作系统,并且开源,所以 ...

  6. JAVA 判断Socket 远程端是否断开连接

    最近在做项目的时候,遇到这样一个问题,如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如  isClosed().isConnect ...

  7. java反射,ReflectUtils

    public class ReflectUtils { /** * 通过构造函数实例化对象 * @param className 类的全路径名称 * @param parameterTypes 参数类 ...

  8. HTML5学习总结

    一.HTML5概念 HTML5并不仅仅只是做为HTML标记语言的一个最新版本,更重要的是它制定了Web应用开发的一系列标准,成为第一个将Web做为应用开发平台的HTML语言. HTML5定义了一系列新 ...

  9. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  10. Java中serialVersionUID

    报错信息如下: Adds a default serial version ID to the selected type. Use this option to add a user-defined ...