直接求不好求引入未知数,考虑采用补集转化

对于一次非剪刀石头布的情况,定是一个人赢了另两个人

若知道一个人共赢了多少人,那么就贡献了n*(n-1)/2种不同的情况

更一般的,一个人如果多赢了一个人,他的新增的贡献就是他当前没有加上这个人时已经赢了的人

费用流。

st->比赛->人->ed,费用是递增的,对于人拆点,一条一条不同费用的连

我真是震惊了暴力跑得比费用流还快。。。ORZ bzoj14年就踩崩这题的test_tset在discuss教我迭代

ta没回我之前我脑洞大开写了一发模拟退火,效果极差,我想了一手随机处理2的顺序直接贪心,发现和正确答案已经很接近了,导致退火完全跳不出来。。。

然后这个大佬的做法:

实践中这个做法比我的网络流快了1倍不止(或许是修正主义在作祟???)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=(1<<30);struct node
{int x,y,c,d,next;
}a[410000];int len,last[11000];
void ins(int x,int y,int c,int d)
{len++;a[len].x=x;a[len].y=y;a[len].c=c;a[len].d=d;a[len].next=last[x];last[x]=len;len++;a[len].x=y;a[len].y=x;a[len].c=0;a[len].d=-d;a[len].next=last[y];last[y]=len;
}int st,ed;
int pre[11000],c[11000],d[11000],ans;
int list[11000];bool v[11000];
bool spfa()
{memset(d,63,sizeof(d));d[st]=0;c[st]=inf;memset(v,false,sizeof(v));v[st]=true;int head=1,tail=2;list[1]=st;while(head!=tail){int x=list[head];for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(a[k].c>0&&d[y]>d[x]+a[k].d){d[y]=d[x]+a[k].d;c[y]=min(a[k].c,c[x]);pre[y]=k;if(v[y]==false){v[y]=true;list[tail]=y;tail++;if(tail==10500)tail=1;}}}v[x]=false;head++;if(head==10500)head=1;}if(d[ed]==d[0])return false;else{int y=ed;ans+=c[ed]*d[ed];while(y!=st){int k=pre[y];a[k].c-=c[ed];a[k^1].c+=c[ed];y=a[k].x;}return true;}
}int mp[110][110],px[11000],py[11000];
int hw[110],hl[110];
int main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout);int n,z=0,sum=0;scanf("%d",&n);len=1; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&mp[i][j]);if(i>=j)continue;if(mp[i][j]==1)sum+=hw[i],hw[i]++,hl[j]++;else if(mp[i][j]==0)sum+=hw[j],hw[j]++,hl[i]++;else z++,px[z]=i,py[z]=j,ins(2*n+z,i,1,0), ins(2*n+z,j,1,0);}st=2*n+z+1,ed=2*n+z+2;for(int i=1;i<=z;i++)ins(st,2*n+i,1,0);for(int i=1;i<=n;i++){for(int j=hw[i]+1;j<=n-hl[i];j++)ins(i,i+n,1,j-1);ins(i+n,ed,inf,0);}while(spfa());printf("%d\n",n*(n-1)/2*(n-2)/3-(ans+sum));int x,y,g;for(int i=2;i<=len;i+=2)if(a[i].x>2*n&&a[i].x<=2*n+z){g=a[i].x-2*n;if(px[g]==a[i].y)x=px[g],y=py[g];else x=py[g],y=px[g];mp[x][y]=a[i].c^1;}for(int i=1;i<=n;i++){for(int j=1;j<n;j++)printf("%d ",mp[i][j]);printf("%d\n",mp[i][n]);}return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/10265258.html

bzoj2597: [Wc2007]剪刀石头布相关推荐

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

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

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

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

  3. [WC2007] 剪刀石头布

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

  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. 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
  2. mac下开启docker API远程调用
  3. 注意力不集中的判断标准
  4. 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
  5. mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
  6. 面试字节跳动,我被怼了……
  7. Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——习题7-12
  8. Jacob Java程序把Word文档直接转换成Html文件
  9. [******] 堆排序
  10. webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc «(», expected punc
  11. 华为研发雄起加拿大!
  12. CYQ.Data 轻量数据层之路 使用篇-裸身走走天涯 视频 B (十九)
  13. 渗透测试-内网横向MS-17010利用方法总结
  14. 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
  15. c语言字符串把小写转换大写字母,c语言将字符串中的小写字母转换成大写字母...
  16. 传奇源码分析-服务器端(SelGate服务器分析)
  17. windows系统安全基础知识——系统进程与病毒
  18. Dell inspiron 7580硬件升级_更换电池加内存条移动硬盘
  19. Meta Connect汇总:Quest Pro发布,主打生产力场景
  20. 4个免费的临时邮箱,保证可用,持续更新

热门文章

  1. 数据结构线性表博客作业总结
  2. Gradle语法基础解析
  3. BGP属性+13条选路原则(转载)
  4. 使用Data Profile进行数据剖析
  5. 记录下UIButton的图文妙用和子控件的优先显示
  6. linux 下启动mysql
  7. 推荐优秀的SQL脚本调试工具Embarcadero DBArtisan 可以调试SQL Server 2000/2005 SQL调试工具汇总...
  8. S1.2 Python开发规范指南
  9. 读取csv绘制直方图_[python]用tushare接口绘制Bollinger Bands
  10. shell 中常用到的基础命令