bzoj 2597 [Wc2007]剪刀石头布——费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597
三个人之间的关系,除了“剪刀石头布”,就是有一个人赢了2局;所以考虑算补集,则每个人对答案的贡献是 \( -C_{f[ i ]}^{2} = \frac{f[ i ]*(f[ i ]-1)}{2}\) ,其中 f[ i ] 表示这个人赢的局数。
所以一个人多赢了一局,对答案的贡献是 -f[ i ] ;再多赢一局,就是 -( f[ i ] + 1 ) ……只要每个人向汇点连足够的边,其中每条边容量是1、费用依次为 f[ i ] , f[ i ]+1 , …… 就行了,因为会先走费用小的,符合意义。
对于每场未确定比赛,新建一个点,从源点向它连容量为1、费用为0的边;然后从它分别向两个人连容量为1、费用为0的边,表示这场比赛会令其中一个人增加费用。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=,M=,INF=M;
int n,cnt,f[N],c[N],ans,hd[N+M],xnt=,b[N][N],dy[M];
int dis[N+M],pre[N+M],incf[N+M];bool vis[N+M];
struct Ed{
int fr,to,nxt,cap,w;
Ed(int f=,int a=,int b=,int c=,int d=):fr(f),to(a),nxt(b),cap(c),w(d) {}
}ed[(N*N+M*)<<];
queue<int> q;
int Mn(int a,int b){return a<b?a:b;}
void add(int x,int y,int z,int w)
{
ed[++xnt]=Ed(x,y,hd[x],z,w);hd[x]=xnt;
ed[++xnt]=Ed(y,x,hd[y],,-w);hd[y]=xnt;
}
bool spfa()
{
memset(dis,0x3f,sizeof dis);
dis[]=;vis[]=;q.push();
pre[cnt]=;incf[]=INF;
while(q.size())
{
int k=q.front();q.pop();vis[k]=;
for(int i=hd[k],v;i;i=ed[i].nxt)
if(ed[i].cap&&dis[v=ed[i].to]>dis[k]+ed[i].w)
{
dis[v]=dis[k]+ed[i].w;pre[v]=i;
incf[v]=Mn(incf[k],ed[i].cap);
if(!vis[v])q.push(v),vis[v]=;
}
}
return pre[cnt];
}
void ek()
{
int ret=incf[cnt];
for(int k=pre[cnt];k;k=pre[ed[k].fr])
{
ed[k].cap-=ret;ed[k^].cap+=ret;
ans-=ed[k].w*ret;
}
}
int main()
{
scanf("%d",&n);cnt=n;int val=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&b[i][j]);if(i>=j)continue;
if(b[i][j]==)f[i]++; else if(!b[i][j])f[j]++;
else
{
c[i]++;c[j]++;cnt++;val++;
add(,cnt,,);add(cnt,i,,);add(cnt,j,,);
dy[cnt-n]=xnt-;
}
}
cnt++; ans=n*(n-)*(n-)/;
for(int i=;i<=n;i++)
{
ans-=f[i]*(f[i]-)/;
for(int j=;j<c[i];j++)add(i,cnt,,f[i]+j);
}
while(spfa())ek();
for(int i=,p=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i>=j||b[i][j]<)continue;
p++;
if(ed[dy[p]].cap)b[i][j]=,b[j][i]=;
else b[i][j]=,b[j][i]=;
}
printf("%d\n",ans);
for(int i=;i<=n;i++,puts(""))
for(int j=;j<=n;j++)printf("%d ",b[i][j]);
return ;
}
bzoj 2597 [Wc2007]剪刀石头布——费用流的更多相关文章
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- BZOJ 2597: [Wc2007]剪刀石头布(费用流)
传送门 解题思路 考虑全集-不能构成三元环的个数.如果三个点不能构成三元环,一定有一个点的入度为\(2\),继续扩展,如果一个点的度数为\(3\),则会失去3个三元环.对于一个点来说,它所产生的不能构 ...
- bzoj 2597: [Wc2007]剪刀石头布【最小费用最大流】
脑子不太清楚一个zz问题调了好久-- 首先正难则反,因为三元环好像没什么特点,就考虑让非三元环个数最小 考虑非三元环特点,就是环上一定有一个点的入度为2,联系整张图,三元环个数就是每个点C(入度,2) ...
- [WC2007]剪刀石头布——费用流
比较有思维含量的一道题 题意:给混合完全图定向(定向为竞赛图)使得有最多的三元环 三元环条件要求比较高,还不容易分开处理. 正难则反 考虑,什么情况下,三元组不是三元环 一定是一个点有2个入度,一个点 ...
- 2597: [Wc2007]剪刀石头布
2597: [Wc2007]剪刀石头布 链接 分析: 费用流. 首先转化一下问题,整张图最优的情况是存在$C_n^3$个,即任意3个都行,然后考虑去掉最少不满足的三元环. 如果u赢了v,u向v连一条边 ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- Luogu4249 WC2007 石头剪刀布 费用流
传送门 考虑竞赛图三元环计数,设第\(i\)个点的入度为\(d_i\),根据容斥,答案为\(C_n^3 - \sum C_{d_i}^2\) 所以我们需要最小化\(\sum C_{d_i}^2\) 考 ...
- BZOJ 3171 循环格(费用流)
题意 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子.每个元素有一个坐标(行,列),其中左上角元素坐标为(0,0).给定一个起始位置(r,c),你可以沿着箭头防线在格子间行走.即如果(r ...
随机推荐
- JAVA8新特性简单总结
速度更快代码更少强大的StreamAPI便于并行最大化的减少空指针异常Lambda表达式<具体做什么事>和函数式接口Lambda表达式(也叫做闭包)它允许我们将一个函数当作方法的参数(传递 ...
- Linux运维第二天:安装虚拟机软件及RHEL7.2 64位系统
第一步:安装虚拟机 一路默认就行啦(还是要改下安装路径,嘿嘿) 第二步:安装RHEL7.2 64位系统 1.新建一个虚拟机 典型和自定义随便选(最后都可以调的) 一般大婶都喜欢选自定义(自己可以设置的 ...
- HDU 4734 F(x) ★(数位DP)
题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...
- Truncate a string
用瑞兹来截断对面的退路! 截断一个字符串! 如果字符串的长度比指定的参数num长,则把多余的部分用...来表示. 切记,插入到字符串尾部的三个点号也会计入字符串的长度. 但是,如果指定的参数num小于 ...
- 008-对象—— 对象$this self parent 内存方式及使用方法讲解
<?php /** * */ /*class Web{ private $webname; private $weburl; function __construct($webname,$web ...
- 本地如何搭建IPv6环境测试你的APP(转)
IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...
- vim 强大复制链接
参考文献: http://blog.csdn.net/xiyuan1999/article/details/5680102 vi编辑器中的整行(多行)复制与粘贴就非常必要了. 1.复制 1)单行复制 ...
- Android虚拟、实体键盘不能同时使用?
/****************************************************************************** * Android虚拟.实体键盘不能同时 ...
- js之放大镜效果
HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Git-Svn 建立工作目录
使用Git-SVN 建立工作目录 GIT-SVN可以以SVN的版本为基础, 实现”私有”的版本管理功能. 这样一些不成熟但又需要记录的版本就不必提交到SVN上, 而只在自己本地私有的版本里出现. 下面 ...