WC2007 剪刀石头布【补集转化+比赛问题费用流】
题目描述:
N个点的竞赛图,已知一部分比赛结果,求安排剩下比赛的胜负情况,使得三元环的数量最大(A胜B,B胜C,C胜A)。N<=100
题目分析:
直接统计三元环并不好做,考虑非三元环的情况,必然是一个人胜2场,另一个人胜1场,第三个人胜0场。可以看出如果一个人最后胜的场次为wiw_iwi,则会贡献wi(wi−1)2\frac {w_i(w_i-1)}{2}2wi(wi−1)个非三元环,并且一个非三元环只会被一个人计算到。这样就将问题分成了单独每个人的问题。于是我们要最小化非三元环的数量。
一场比赛会有一个人胜利,如果一个人多胜1场,则会多产生(wi+1)wi2−wi(wi−1)2=wi\frac {(w_i+1)w_i}{2}-\frac {w_i(w_i-1)}{2}=w_i2(wi+1)wi−2wi(wi−1)=wi个非三元环,可以据此作为费用跑最小费用最大流。
具体来说将一场比赛作为1个点,源点向比赛点连容量为1的边,比赛点分别向比赛的两个人连容量为1的边,然后每个人向汇点连比赛场次条费用依次从wiw_iwi递增,容量为1的边。求方案就只需看比赛点向两人的哪条边满流即可。
这道题的费用流建模方式类似于BZOJ1449: [JSOI2009]球队收益,不同的是一个利用补集转化引入建模,一个利用先假设所有比赛为负计算变化量引入建模。都很巧妙。
Code:
#include<cstdio>
#include<deque>
#include<cstring>
#include<algorithm>
#define maxn 5105
#define maxm 50005
using namespace std;
const int inf = 0x3f3f3f3f;
int n,m,S,T;
int fir[maxn],cur[maxn],nxt[maxm],to[maxm],c[maxm],w[maxm],tot=1;
inline void line(int x,int y,int z,int v){nxt[++tot]=fir[x],fir[x]=tot,to[tot]=y,c[tot]=z,w[tot]=v;nxt[++tot]=fir[y],fir[y]=tot,to[tot]=x,c[tot]=0,w[tot]=-v;
}
namespace Costflow{int dis[maxn],ans;bool vis[maxn],inq[maxn];deque<int>q;bool SPFA(){memset(dis,0x3f,(T+1)<<2);dis[T]=0,q.push_back(T);while(!q.empty()){int u=q.front();q.pop_front(),inq[u]=0;for(int i=fir[u],v;i;i=nxt[i]) if(c[i^1]&&dis[v=to[i]]>dis[u]+w[i^1]){dis[v]=dis[u]+w[i^1];if(!inq[v]) {inq[v]=1;if(!q.empty()&&dis[v]<dis[q.front()]) q.push_front(v);else q.push_back(v);}}}return dis[S]!=inf;}int aug(int u,int augco){if(u==T) {ans+=dis[S]*augco;return augco;}vis[u]=1;int need=augco,delta;for(int &i=cur[u];i;i=nxt[i]) if(c[i]&&!vis[to[i]]&&dis[u]==dis[to[i]]+w[i]){delta=aug(to[i],min(need,c[i]));c[i]-=delta,c[i^1]+=delta;if(!(need-=delta)) break;}vis[u]=0;return augco-need;}int solve(){ans=0;while(SPFA()) memcpy(cur,fir,(T+1)<<2),aug(S,inf);return ans;}
}
int a[105][105],d[105],x[maxn],y[maxn],win[105],cnt,sum;
int main()
{scanf("%d",&n),S=0;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){scanf("%d",&a[i][j]);if(a[i][j]==1) win[i]++;if(a[i][j]==2&&i<j) line(S,n+(++cnt),1,0),line(n+cnt,x[cnt]=i,1,0),line(n+cnt,y[cnt]=j,1,0),d[i]++,d[j]++;}T=n+cnt+1;for(int i=1;i<=n;i++){sum+=win[i]*(win[i]-1)/2;while(d[i]--) line(i,T,1,win[i]++);}printf("%d\n",n*(n-1)*(n-2)/6-(sum+Costflow::solve()));for(int i=1,loser;i<=cnt;i++){for(int j=fir[n+i];j;j=nxt[j]) if(to[j]&&c[j]) loser=to[j];a[x[i]][y[i]]=loser==y[i],a[y[i]][x[i]]=loser==x[i];}for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%d%c",a[i][j]," \n"[j==n]);
}
WC2007 剪刀石头布【补集转化+比赛问题费用流】相关推荐
- P4249 [WC2007]剪刀石头布(网络流/费用流)
P4249 [WC2007]剪刀石头布 在一个竞赛图上一些边的方向已经确定,但是还有一些边的方向没有确定,求解最多有多少三元环. 首先看到三元环个数,按照套路我们利用度数计算,然后考虑每一条边,每一条 ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- P4249-[WC2007]剪刀石头布【费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P4249 题目大意 nnn个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多. 1≤n≤ ...
- bzoj2597: [Wc2007]剪刀石头布
直接求不好求引入未知数,考虑采用补集转化 对于一次非剪刀石头布的情况,定是一个人赢了另两个人 若知道一个人共赢了多少人,那么就贡献了n*(n-1)/2种不同的情况 更一般的,一个人如果多赢了一个人,他 ...
- 网络流 最大流 最小割 费用流
[腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...
- POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...
- POJ2135 来回最短路(简单费用流)
题意: 就是从1走到n然后再走回来,一条边只能走一次,要求路径最短. 思路: 比较水,可以直接一遍费用流,不解释了,具体的看看代码,敲这个题就是为了练 练手,好久不敲了,怕比赛 ...
- Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)
题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...
- BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...
最新文章
- 论排列组合,持续更新
- 苹果笔记本只有电源键能用的解决办法
- cpc卡内计费信息异常包括_抖音CPC是什么?广告的优势在哪?抖音CPC广告转化率高吗?...
- 关于SVN Server自助修改密码详细教程
- 时频分析:短时傅里叶变换实现(1)
- 【全链路质量监控与QoE】
- 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
- Rancher 2.5 正式发布,多项重大更新来袭!
- MacOS下MySQL配置
- c语言编辑学生信息录入的程序,c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!!...
- 《An Introduction to Ray Tracing》—— 2.5 Ray/Quadric Intersection And Mapping
- 保护数据库安全十七招
- 发现极为好用的数据库连接工具,基本上包含所有数据库DBeaver
- pixel 1 欧版电信破解4G,安卓P亲测可用(打电话+4G上网)
- 打坐是开发潜能的快速方法
- PHP中smart原则,SMART原则的五大原则是什么
- idea,maven飘红及无法打包问题
- 使用QSS美化PyQt5界面,分享4套超赞皮肤和QSS专用编辑器!
- 硬核讲解 Jetpack 之 LifeCycle 使用篇
- python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...