【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并得一分.如果一个人的得分最高,或者他打败所有比自己得分高的人,那么 ...
随机推荐
- vmware 修改IP 提示子网掩码错误~
我打开[编辑]->[虚拟网络编辑器]菜单 修改网络设置 提示 子网掩码错误 如下图所示 上网查询,使用如下方法解决问题 这个虚拟网络编辑器是给你添加网卡的,你添加vmnet1就是在你真实的电脑上 ...
- Oracle系统学习摘要
对于企业级大型系统,Oracle数据库的重要性不言而喻,作为长期使用Sql server的developer,花了点时间学习了一个Oracle的系列课程,总结一下. 1.oracle一些基础命令 sq ...
- SVN外链
1 外链使用场景 使用Subversion进行版本管理时,有时需要将一些公共库或者开源库链接到自己项目中,为了同时做到与外部库实时更新,使用Subversion的外链功能,从而将外部的库当做本地项目的 ...
- cacti应用
cacti被很多IDC/CDN提供商用来进行带宽计算使用:带宽的95计费(95th Percentile charging) 95计费法是CDN常用计费方法: CDN基本上是每月结一次款.每5分钟取一 ...
- CMakeLists.txt for nginx
project(nginx) cmake_minimum_required(VERSION 2.8) aux_source_directory(. SRC_LIST) aux_source_direc ...
- UITableViewCell重用导致内容混乱方案
UITableViewCell *cell=nil; static NSString *reuse=@"cell"; if (cell==nil) { cell=[[UITable ...
- oracle中字符串连接用||
oracle中字符串连接用|| create or replace procedure testIf(idid number) is v_name stu.name%type; v_age stu.a ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
- KMP算法分析
KMP是一种复杂度较低的字符串比较算法.基本思路是对欲匹配字符串进行预处理,分析当k位匹配时可以后移的位数,所得的数构成该字符串的特征向量. 求特征向量Next int* Next(string p) ...
- R语言获取国内的股票数据
quantmod 包默认是访问 yahoo finance 的数据,其中包括上证和深证的股票数据,还有港股数据. 上证代码是 ss,深证代码是 sz,港股代码是 hk 例如苏宁云商 setSymbol ...