考虑使非剪刀石头布情况尽量少。设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种。那么使Σxi(xi-1)/2尽量小即可。

  考虑网络流。将比赛建成一排点,人建成一排点,每场未确定比赛向比赛双方连边,确定比赛向赢者连边,这样就是一种合法的比赛方案了。

  在此基础上控制代价最小。由于每多赢一场非剪刀石头布情况的增量就更大,将边拆开费用设为增量即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 110
#define S 0
#define T 10101
int n,p[N*N],l[N*N],r[N*N],cnt,t=-1,ans,a[N][N];
int d[N*N],q[N*N],pre[N*N];
bool flag[N*N];
struct data{int to,nxt,cap,flow,cost;
}edge[N*N<<4];
void addedge(int x,int y,int z,int cost)
{t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=0,edge[t].cost=cost,p[x]=t;t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=0,edge[t].flow=0,edge[t].cost=-cost,p[y]=t;
}
int inc(int &x){x++;if (x>T) x-=T;return x;}
bool spfa()
{memset(d,42,sizeof(d));d[S]=0;memset(flag,0,sizeof(flag));int head=0,tail=1;q[1]=S;do{int x=q[inc(head)];flag[x]=0;for (int i=p[x];~i;i=edge[i].nxt)if (d[x]+edge[i].cost<d[edge[i].to]&&edge[i].flow<edge[i].cap){d[edge[i].to]=d[x]+edge[i].cost;pre[edge[i].to]=i;if (!flag[edge[i].to]) q[inc(tail)]=edge[i].to,flag[edge[i].to]=1;}}while (head!=tail);return d[T]<=10000000;
}
void ekspfa()
{while (spfa()){int v=1;for (int i=T;i!=S;i=edge[pre[i]^1].to)if (edge[pre[i]].flow==edge[pre[i]].cap) {v=0;break;}if (v)for (int i=T;i!=S;i=edge[pre[i]^1].to)ans-=edge[pre[i]].cost,edge[pre[i]].flow++,edge[pre[i]^1].flow--;}
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj2597.in","r",stdin);freopen("bzoj2597.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifcnt=n=read();memset(p,255,sizeof(p));for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){int x=read();if (i<j){cnt++;l[cnt]=i,r[cnt]=j;addedge(S,cnt,1,0);if (x==0) addedge(cnt,j,1,0);else if (x==1) addedge(cnt,i,1,0);else addedge(cnt,i,1,0),addedge(cnt,j,1,0);}}for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)addedge(i,T,1,j-1);ans=n*(n-1)*(n-2)/6;ekspfa();cout<<ans<<endl;for (int i=n+1;i<=cnt;i++)for (int j=p[i];~j;j=edge[j].nxt)if (edge[j].flow>0) if (edge[j].to==l[i]) a[l[i]][r[i]]=1;else a[r[i]][l[i]]=1;for (int i=1;i<=n;i++){for (int j=1;j<=n;j++)printf("%d ",a[i][j]);printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9595597.html

BZOJ2597 WC2007剪刀石头布(费用流)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  7. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  8. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  9. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

最新文章

  1. 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究
  2. openvswitch 流表操作(四十八)
  3. 简明 Python 编程规范
  4. linux插光驱自动重启,Linux两种光驱自动挂载的方法
  5. 在项目中寻找代码的坏味道(命名)
  6. mfc嵌入matlab绘图窗口,将matlab的图嵌入MFC
  7. 白鹭php源码,白鹭/CDNDrive
  8. Linux网络监控工具nethogs
  9. day23 java的异常
  10. python的matplotlib的函数_在Python中使用matplotlib绘制条件函数
  11. js在html中加文字走马灯特效,jQuery简单的文字跑马灯特效
  12. 如何选择正确的控制系统?PLC和DCS各有不同
  13. dfs dtft dft fft
  14. 利用IsPostBack检查网页是不是第一次进入(asp.net)
  15. 下列哪个滤波器是非线性的_上海海事数字信号处理2006试卷A参考答案
  16. Windows10 启动 Docker Desktop 时报错 Containers feature is disabled
  17. 前端——14.用HTML做的小练习
  18. CentOS8 安装mysql8- 解压安装版
  19. HCIE-RS论述题QOS
  20. Java 枚举类型的应用

热门文章

  1. c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)
  2. 连接mysql超时时间设置多少_怎么设置数据库的连接数和连接超时时间
  3. mysql 4字节utf8_MySQL 4字节utf8字符更新失败一例
  4. rpm -e --nodeps_微课 | rpm的思维导图
  5. php8更新,PHP 8 中新特性以及重大调整
  6. android 代码获取屏幕图像,安卓获取屏幕以及获得像素点 ~ 大树洞
  7. JavaScript中带有示例的Math.PI属性
  8. Java BigDecimal longValueExact()方法与示例
  9. Java StringBuilder subSequence()方法与示例
  10. python求和_Python程序查找特殊求和系列的解决方案