正着求不太好求,,但是不是剪刀石头布的又很好表示:三个人中恰好有一个人赢了两场。 所以我们考虑让这种三元组数量最少使得剪刀石头布最多。

考虑一个人如果赢了i场,那么他对 非剪刀石头布的三元组的贡献是 -> i(i-1)/2  ,也就是他和任意两个被他击败的人都可以组成三元组。并且每个人的贡献都是独立的,不会有重复(因为一个非法三元组只可能有一个人是赢两局的)。

所以我们就可以用类似 平方费用 的最小费用流  求解此题了。

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int maxn=11005;
const int inf=1<<30;
vector<int> g[maxn];
struct lines{int from,to,flow,cap,cost;
}l[maxn*23];
int S,T,t=-1,d[maxn],A[maxn],p[maxn];
int G[105][105],ID[105][105],cnt;
int n,m,ans,Awin[105];
bool iq[maxn];inline void add(int from,int to,int cap,int cost){l[++t]=(lines){from,to,0,cap,cost},g[from].pb(t);l[++t]=(lines){to,from,0,0,-cost},g[to].pb(t);
}inline bool SPFA(){queue<int> q;memset(d,0x3f,sizeof(d));d[S]=0,iq[S]=1,q.push(S);A[S]=inf,p[S]=0;int x; lines e;while(!q.empty()){x=q.front(),q.pop();for(int i=g[x].size()-1;i>=0;i--){e=l[g[x][i]];if(e.flow<e.cap&&d[e.to]>d[x]+e.cost){d[e.to]=d[x]+e.cost;A[e.to]=min(A[x],e.cap-e.flow);p[e.to]=g[x][i];if(!iq[e.to]) iq[e.to]=1,q.push(e.to);}}iq[x]=0;}if(d[T]==d[T+1]) return 0;ans-=A[T]*d[T];int now=T,pre;while(now!=S){pre=p[now];l[pre].flow+=A[T];l[pre^1].flow-=A[T];now=l[pre].from;}return 1;
}inline void MFMC(){while(SPFA());
}int main(){
//  freopen("data.in","r",stdin);
//  freopen("data.out","w",stdout);scanf("%d",&n),ans=n*(n-1)*(n-2)/6,cnt=n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&G[i][j]);if(i<j){if(G[i][j]==2) ID[i][j]=++cnt;else if(G[i][j]) Awin[i]++;else Awin[j]++;}}S=0,T=cnt+1;for(int i=1;i<=n;i++){ans-=Awin[i]*(Awin[i]-1)>>1;while(Awin[i]<n-1) add(i,T,1,Awin[i]),Awin[i]++;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) if(ID[i][j]){add(S,ID[i][j],1,0);add(ID[i][j],i,1,0);add(ID[i][j],j,1,0);}MFMC();for(int i=1;i<=n;i++)for(int j=1,now;j<=n;j++) if(ID[i][j]){now=ID[i][j];for(int k=g[now].size()-1;k>=0;k--){lines e=l[g[now][k]];if(e.flow==1){if(e.to==i) G[i][j]=1,G[j][i]=0;else G[i][j]=0,G[j][i]=1;break;}}}printf("%d\n",ans);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) printf("%d ",G[i][j]);puts("");}return 0;
}

  

转载于:https://www.cnblogs.com/JYYHH/p/8978819.html

[WC2007] 剪刀石头布相关推荐

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

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

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

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

  3. BZOJ2597 WC2007剪刀石头布(费用流)

    考虑使非剪刀石头布情况尽量少.设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种.那么使Σxi(xi-1)/2尽量小即可. 考虑网络流.将比赛建成一排点,人建成一排点, ...

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

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

  5. WC2007 剪刀石头布【补集转化+比赛问题费用流】

    题目描述: N个点的竞赛图,已知一部分比赛结果,求安排剩下比赛的胜负情况,使得三元环的数量最大(A胜B,B胜C,C胜A).N<=100 题目分析: 直接统计三元环并不好做,考虑非三元环的情况,必 ...

  6. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  7. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  8. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

  9. BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)

    Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道 ...

最新文章

  1. 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
  2. GPU(CUDA)学习日记(十一)------ 深入理解CUDA线程层次以及关于设置线程数的思考
  3. Java实现结构体,让字节流封送简单起来
  4. idea mybatis插件_IntelliJ IDEA插件推荐(二)
  5. RHCS创建高可用集群apche服务器
  6. vxworks 调式
  7. 谷歌推出量子机器学习框架TFQ-TensorFlow Quantum,一个可训练量子模型的机器学习框架...
  8. 点击图片添加文件在Chrome中使用的兼容问题
  9. 为什么C语言输出结果总是1,c语言编程问题这个题我哪里错了输出结果总是0
  10. 自定义标题栏右键菜单
  11. python并集符号_Python Union()用法及代码示例
  12. 惠普服务器u盘系统安装win7系统教程,惠普星14笔记本U盘安装win7系统的操作教程...
  13. java发布rest服务器_ArcGIS Server 10 Java 版的Rest服务的部署方法
  14. Qt5学习笔记之QQ登录界面四:界面布局
  15. 基于相关向量机RVM的分类算法
  16. 51单片机:8051指令简介
  17. HTML语言源代码实例
  18. Windows XP SP2下载[转自Mydrivers.com]
  19. CSP漫画工作室clipstudiopaint最新版本2022功能介绍
  20. 一文搞懂Spring,堪称Spring源码终结者

热门文章

  1. 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)
  2. 视频主观质量评价工具:MSU Perceptual Video Quality tool
  3. Windows平台下NS2网络仿真环境的搭建
  4. java vk减号_Vue入门经常使用指令
  5. POST 请求出现异常!java.io.IOException: Server returned HTTP response code: 400 for URL
  6. 销售管理c语言程序设计,C语言课程设计销售管理系统
  7. 开发商微信选房后不退认筹金_新楼盘开盘的“认筹”和“认购”,劝您看懂后再去认!...
  8. vscode 清空缓存_如何清除Visual Studio Code的TypeScript的intellisense缓存?
  9. Python面向对象模型概述
  10. UnityShader7:内置包含文件UnityCG.cginc与GG/HLSL语义