题目描述:

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 剪刀石头布【补集转化+比赛问题费用流】相关推荐

  1. P4249 [WC2007]剪刀石头布(网络流/费用流)

    P4249 [WC2007]剪刀石头布 在一个竞赛图上一些边的方向已经确定,但是还有一些边的方向没有确定,求解最多有多少三元环. 首先看到三元环个数,按照套路我们利用度数计算,然后考虑每一条边,每一条 ...

  2. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

  3. P4249-[WC2007]剪刀石头布【费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P4249 题目大意 nnn个点的竞赛图有的边已经确定了方向,要求给剩下的边确定一个方向使得图的三元环最多. 1≤n≤ ...

  4. bzoj2597: [Wc2007]剪刀石头布

    直接求不好求引入未知数,考虑采用补集转化 对于一次非剪刀石头布的情况,定是一个人赢了另两个人 若知道一个人共赢了多少人,那么就贡献了n*(n-1)/2种不同的情况 更一般的,一个人如果多赢了一个人,他 ...

  5. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  6. POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  7. POJ2135 来回最短路(简单费用流)

    题意:       就是从1走到n然后再走回来,一条边只能走一次,要求路径最短. 思路:       比较水,可以直接一遍费用流,不解释了,具体的看看代码,敲这个题就是为了练 练手,好久不敲了,怕比赛 ...

  8. 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 ...

  9. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

最新文章

  1. 论排列组合,持续更新
  2. 苹果笔记本只有电源键能用的解决办法
  3. cpc卡内计费信息异常包括_抖音CPC是什么?广告的优势在哪?抖音CPC广告转化率高吗?...
  4. 关于SVN Server自助修改密码详细教程
  5. 时频分析:短时傅里叶变换实现(1)
  6. 【全链路质量监控与QoE】
  7. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
  8. Rancher 2.5 正式发布,多项重大更新来袭!
  9. MacOS下MySQL配置
  10. c语言编辑学生信息录入的程序,c语言编的学生信息管理系统小程序!!有不足的请指出,谢谢!!...
  11. 《An Introduction to Ray Tracing》—— 2.5 Ray/Quadric Intersection And Mapping
  12. 保护数据库安全十七招
  13. 发现极为好用的数据库连接工具,基本上包含所有数据库DBeaver
  14. pixel 1 欧版电信破解4G,安卓P亲测可用(打电话+4G上网)
  15. 打坐是开发潜能的快速方法
  16. PHP中smart原则,SMART原则的五大原则是什么
  17. idea,maven飘红及无法打包问题
  18. 使用QSS美化PyQt5界面,分享4套超赞皮肤和QSS专用编辑器!
  19. 硬核讲解 Jetpack 之 LifeCycle 使用篇
  20. python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...

热门文章

  1. 电脑服务器型号在哪,电脑服务器型号内存
  2. Android https 自签名和CA证书验证(基于OkHttp)
  3. Glib之GObject简介(翻译)
  4. cocos creator android 真机调试配置密匙
  5. 用javascript统计字数,中文计数问题
  6. 零基础如何快速学习Java?Java基础入门秘诀
  7. html文字跳动特效,Javascrip实现文字跳动特效
  8. protobuf c语言版本
  9. 前端构建工具Gulp的学习和使用
  10. hypermesh生成MNF柔性体