【POJ2699】The Maximum Number of Strong Kings(二分,最大流)
题意:
有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(二分,最大流)的更多相关文章
- POJ2699 The Maximum Number of Strong Kings(最大流)
枚举所有Strong King的状态(最多1024种左右),然后判断是否合法. 判定合法用网络流,源点-比赛-人-汇点,这样连边. 源点向每场比赛连容量为1的边: 如果一场比赛,A和B,A是Stron ...
- 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 (最大流+枚举)
http://poj.org/problem?id=2699 题意: 一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或( v, u),表示u打败v或v ...
- poj 2699 The Maximum Number of Strong Kings 枚举 最大流
题目链接 题意 对于一个竞赛图(有向完全图),其顶点是选手,边是比赛,边\(e=(u,v)\)代表该场比赛中\(u\)战胜\(v\). 现定义选手的分数为其战胜的人的个数(即竞赛图中点的出度).并且定 ...
- poj 2699 The Maximum Number of Strong Kings【最大流+枚举】
因为n很小所以从大到小枚举答案.(从小到大先排个序,因为显然胜利场次越多越容易成为strong king.然后对于每个枚举出来的ans建图.点分别表示人和比赛.s向所有人连接流量为胜利场次的边,所有比 ...
- 【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
http://poj.org/problem?id=2699 (题目链接) 题意 给出1张有向完全图.U->V表示U可以打败V并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...
随机推荐
- PHP类型转换
php代码 <?php$foo = "0"; // $foo 是字符串 (ASCII 48)var_dump($foo) ; echo '<br/>'; $foo ...
- 如何彻底卸载Oracle
如何彻底卸载Oracle 因为Oracle在Windows下的卸载颇有一些麻烦,如果不能完全卸载有可能影响将来的再次安装!常规卸载方法是运行Oracle的自带的卸载程序,可遗憾的是我在卸载时总不能完全 ...
- Hive On Spark环境搭建
Spark源码编译与环境搭建 Note that you must have a version of Spark which does not include the Hive jars; Spar ...
- mysqldump的使用
mysqldump按导入:mysqldump -u用户名 -p密码 -h主机 数据库 < 路径eg:mysql -uroot -p1234 db1 < c:\a.txtmysqldump导 ...
- Linux cache释放
cache释放: To free pagecache: > /proc/sys/vm/drop_caches To free dentries and inodes: > /proc/sy ...
- NRF51822之IIC(MEMS_LIS2DH12)
在上篇介绍了OLED的II以写操作为主,没有进行读取操作.所以在现再补充读取的操作. 我在此以LIS2DH为例子 uint8_t temp; lis2dh_read_registers(LIS2DH_ ...
- [转]非常实用的15款开源PHP类库
源文件:http://www.csdn.net/article/2013-10-09/2817123-PHP-Libraries 英文原文:https://codegeekz.com/useful-p ...
- XidianOJ 1044 炸金花
题目描述 炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产.为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏. 炸金花在这里被简化成这样一 ...
- Android之sqlite的使用 (转载)
Android中的SQLite使用 首先创建数据库类 public class DatabaseHelper extends SQLiteOpenHelper { private stat ...
- 第二次C语言作业
实验一:判断成绩等级. 给定一百分制成绩,要求输出成绩的等级.90以上为A,80-89为B,70-79为C,60-69为D,60分以下为E,输入大于100或小于0时输出"输入数据错误&quo ...