bzoj2597
非常好的网络流题目
首先这里用到了求补集的思想,我们可以先求不满足的三元对的情况
设A-->B代表A赢B
由于最后所有胜负关系都确定,一定是一个完全图,
所以任意一个不合法的三元对,单独取出来一定是1个点出度为2,一个点入度为2,另一点出度1入度1
不妨考虑入度为2的点,从这个点的入边中任意取两条不同的,一定唯一构成一个不合法的三元对
因此合法方案数=C(3,n)-sigma(C(2,in[i]))=C(3,n)+sigma(in[i])/2-sigma(in[i]^2)/2
=C(3,n)+m/2-sigma(in[i]^2)/2=C(3,n)+(n-1)n/4-sigma(in[i]^2)/2
由于前两个是定值,所以我们只要最小化sigma(in[i]^2)/2
不难想到吧每个未确定的关系看做一个点i,s-->i流量为1
i向连接的两个点各连边流量为1的边,费用都为0
关键是点连向t的边,这里与流量二次成正比
考虑到1+3+5+……2n-1=n^2
我们考虑流量n拆成n条流量为1的边,费用依次是1,3,5……2n-1
然后建图跑最小费用流即可
最后求方案也很简单,看做网络流后,找到每个关系的流量流向哪个点即可
const inf=;
type node=record
next,point,flow,cost:longint;
end; var edge:array[..] of node;
q:array[..] of longint;
s,p,cur,pre,d:array[..] of longint;
v:array[..] of boolean;
a:array[..,..] of longint;
x,i,j,n,m,t,len,ans:longint; procedure add(x,y,f,c:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].flow:=f;
edge[len].cost:=c;
edge[len].next:=p[x];
p[x]:=len;
end; function spfa:boolean;
var x,f,r,i,y:longint;
begin
f:=;
r:=;
q[]:=;
fillchar(v,sizeof(v),false);
v[]:=true;
for i:= to t do
d[i]:=inf;
d[]:=;
while f<=r do
begin
x:=q[f];
v[x]:=false;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if edge[i].flow> then
if d[y]>d[x]+edge[i].cost then
begin
d[y]:=d[x]+edge[i].cost;
pre[y]:=x;
cur[y]:=i;
if not v[y] then
begin
v[y]:=true;
inc(r);
q[r]:=y;
end;
end;
i:=edge[i].next;
end;
inc(f);
end;
if d[t]=inf then exit(false) else exit(true);
end; function mincost:longint;
var i,j:longint;
begin
mincost:=;
while spfa do
begin
i:=t;
mincost:=mincost+d[t];
while i<> do
begin
j:=cur[i];
dec(edge[j].flow);
inc(edge[j xor ].flow);
i:=pre[i];
end;
end;
end; function find(x:longint):longint;
var i:longint;
begin
i:=p[x];
while i<>- do
begin
if (edge[i].flow=) and (edge[i].point<>) then
exit(edge[i].point); //看流向哪个点,哪个点就输了
i:=edge[i].next;
end;
exit(-);
end; begin
len:=-;
fillchar(p,sizeof(p),);
readln(n);
for i:= to n do
begin
for j:= to n do
begin
read(a[i,j]);
if (i<j) then //避免重复
begin
if a[i,j]= then
begin
inc(m);
add(,m+n,,);
add(n+m,,,);
add(m+n,i,,);
add(i,m+n,,);
add(m+n,j,,);
add(j,m+n,,);
end
else if a[i,j]= then inc(s[j])
else inc(s[i]);
end;
end;
readln;
end;
t:=m+n+;
ans:=n*(n-) div +n*(n-)*(n-) div ;
for i:= to n do
begin
ans:=ans-sqr(s[i]); //已经有确定的入度k的点就相当于与t相连的前k条边已经满流了
for j:=s[i]+ to n do
begin
add(i,t,,j*-);
add(t,i,,-j*);
end;
end;
ans:=(ans-mincost) div ;
writeln(ans);
m:=;
for i:= to n- do
for j:=i+ to n do
if a[i,j]= then
begin
inc(m);
x:=find(m+n);
if x=i then
begin
a[i,j]:=;
a[j,i]:=;
end
else begin
a[i,j]:=;
a[j,i]:=;
end;
end; for i:= to n do
begin
for j:= to n do
write(a[i,j],' ');
writeln;
end;
end.
bzoj2597的更多相关文章
- BZOJ2597 WC2007剪刀石头布(费用流)
考虑使非剪刀石头布情况尽量少.设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种.那么使Σxi(xi-1)/2尽量小即可. 考虑网络流.将比赛建成一排点,人建成一排点, ...
- BZOJ2597 [Wc2007]剪刀石头布 【费用流】
题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...
- 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流
[BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...
- 【BZOJ-2597】剪刀石头布 最小费用最大流
2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1016 Solved: ...
- BZOJ2597 [Wc2007]剪刀石头布(最小费用最大流)
题目大概是说n个人两两进行比赛,问如何安排几场比赛的输赢使得A胜B,B胜C,C胜A这种剪刀石头布的三元组最多. 这题好神. 首先,三元组总共有$C_n^3$个 然后考虑最小化不满足剪刀石头布条件的三元 ...
- bzoj2597: [Wc2007]剪刀石头布
Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道 ...
- bzoj2597: [Wc2007]剪刀石头布(费用流)
传送门 不得不说这思路真是太妙了 考虑能构成三元组很难,那我们考虑不能构成三元组的情况是怎么样 就是说一个三元组$(a,b,c)$,其中$a$赢两场,$b$赢一场,$c$没有赢 所以如果第$i$个人赢 ...
- 【bzoj2597】[Wc2007]剪刀石头布 动态加边费用流
题目描述 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这 ...
- [bzoj2597][Wc2007]剪刀石头布_费用流
[Wc2007]剪刀石头布 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 题解: 发现直接求三元环不好求,我们考虑任选三个点不是 ...
随机推荐
- 在sql2008的实例 中 编写存储过程 读取 版本为sql2005 的实例 中的某个数据库里的数据
--创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvl ...
- 我对WindowsPhone8的一些反大众看法.
最近看到网上好多人抱怨wp8的系统设计.我个人有一些观点.实在是不吐不快! 1.为什么系统没有重力感应开关. 答:因为这部分开关功能不是wp8所必备的.只是APP的一个功能.所以.错误在APP上因 ...
- 深入理解shared pool共享池之library cache的library cache lock系列四
本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见: 深入理解shared pool共享池之library cache的library ca ...
- AUTOTRACE Statistics常用列解释
AUTOTRACE Statistics常用列解释 序号 列名 解释 1 db block gets 从buffer cache中读取的block的数量 2 consistent gets 从buff ...
- Delphi OO
深入Delphi编程(OOP) 日期:2007年11月9日 作者:左轻侯 人气: 2595 查看:[大字体 中字体 小字体] 刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视 ...
- (九)Struts2 防重复提交
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:重复提交示例演示 struts.xml <?xml version ...
- JAVA zip解压 MALFORMED 错误
最近在在使用zip 解压时,使用JDK1.7及以上版本在解压时,某些文件会报异常 Exception in thread "main" java.lang.IllegalArgum ...
- [学习笔记]设计模式之Proxy
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...
- IE6 for WIN8
分享一款微软原生内核的Ie6,绿色免安装,无广告,无插件. 点击下载IE6 for WIN8 来源:子涵的博客
- ubuntu 安装apache2,mysql,php5,phpmyadmin等软件
1.安装apache2 sudo apt-get install apache2 输入Y回车 apache2 安装完成 检测:在浏览器输入localhost 出现It works则成功. 2. ...