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 ...
随机推荐
- 1-18 编译安装内核支持ntfs文件系统
大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =============================== ...
- win10下安装VS2005运行程序出现0x000007b错误的解决方法
项目工程一运行就报错...真心坑... 方法如下: 1.安装DirectX 9.0c 形成原因是因为DirectX 9.0被损坏, 只需要安装即可. 如果有电脑管家的.在电脑管家里面搜索“Direct ...
- Fiddler进行模拟Post提交json数据,总为null解决方式(转)
原文链接:http://www.cnblogs.com/jys509/p/3550598.html Request Headers: User-Agent: FiddlerHost: localhos ...
- (转) MapReduce Design Patterns(chapter 2 (part 1))(二)
CHAPTER 2 .Summarization Patterns 随着每天都有更多的数据加载进系统,数据量变得很庞大.这一章专注于对你的数据顶层的,概括性意见的设计模式,从而使你能扩展思路,但可能 ...
- spring boot 教程(一) 构建我的第一个Spring boot
Spring Boot特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标, ...
- XOR Queries(莫队+trie)
题目链接: XOR Queries 给出一个长度为nn的数组CC,回答mm个形式为(L, R, A, B)(L,R,A,B)的询问,含义为存在多少个不同的数组下标k \in [L, R]k∈[L,R] ...
- python使用wget下载网络文件
wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. ubuntu 安装wget pip install wget 从网络或本地硬盘下载文件(并 ...
- Android编程 高德地图 AMapLocationClientOption 类中 setWifiActiveScan过时
高德地图中 定位包中有以下方法: AMapLocationClientOption 类中 setWifiActiveScan 过时 isWifiActiveScan public boole ...
- Uncaught TypeError: jQuery.i18n.browserLang is not a function
/********************************************************************* * Uncaught TypeError: jQuery. ...
- 【集成学习】安装lightgbm
1.下载whl lightgbm的whl下载地址 2.输入命令 pip install lightgbm-2.0.3-py2.py3-one-win_am64.whl 3.验证是否成功 import ...