bzoj2597: [Wc2007]剪刀石头布
直接求不好求引入未知数,考虑采用补集转化
对于一次非剪刀石头布的情况,定是一个人赢了另两个人
若知道一个人共赢了多少人,那么就贡献了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]剪刀石头布相关推荐
- BZOJ2597 WC2007剪刀石头布(费用流)
考虑使非剪刀石头布情况尽量少.设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种.那么使Σxi(xi-1)/2尽量小即可. 考虑网络流.将比赛建成一排点,人建成一排点, ...
- P4249 [WC2007]剪刀石头布(网络流/费用流)
P4249 [WC2007]剪刀石头布 在一个竞赛图上一些边的方向已经确定,但是还有一些边的方向没有确定,求解最多有多少三元环. 首先看到三元环个数,按照套路我们利用度数计算,然后考虑每一条边,每一条 ...
- [WC2007] 剪刀石头布
正着求不太好求,,但是不是剪刀石头布的又很好表示:三个人中恰好有一个人赢了两场. 所以我们考虑让这种三元组数量最少使得剪刀石头布最多. 考虑一个人如果赢了i场,那么他对 非剪刀石头布的三元组的贡献是 ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
- WC2007 剪刀石头布【补集转化+比赛问题费用流】
题目描述: N个点的竞赛图,已知一部分比赛结果,求安排剩下比赛的胜负情况,使得三元环的数量最大(A胜B,B胜C,C胜A).N<=100 题目分析: 直接统计三元环并不好做,考虑非三元环的情况,必 ...
- 做题记录 To 2019.2.13
2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- bzoj 乱刷计划 50/50
前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...
- BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)
Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道 ...
最新文章
- 关于Java为什么配置好环境变量但是不能在命令行cmd运行javac的问题
- mac下开启docker API远程调用
- 注意力不集中的判断标准
- 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
- mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
- 面试字节跳动,我被怼了……
- Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——习题7-12
- Jacob Java程序把Word文档直接转换成Html文件
- [******] 堆排序
- webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc «(», expected punc
- 华为研发雄起加拿大!
- CYQ.Data 轻量数据层之路 使用篇-裸身走走天涯 视频 B (十九)
- 渗透测试-内网横向MS-17010利用方法总结
- 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
- c语言字符串把小写转换大写字母,c语言将字符串中的小写字母转换成大写字母...
- 传奇源码分析-服务器端(SelGate服务器分析)
- windows系统安全基础知识——系统进程与病毒
- Dell inspiron 7580硬件升级_更换电池加内存条移动硬盘
- Meta Connect汇总:Quest Pro发布,主打生产力场景
- 4个免费的临时邮箱,保证可用,持续更新
热门文章
- 数据结构线性表博客作业总结
- Gradle语法基础解析
- BGP属性+13条选路原则(转载)
- 使用Data Profile进行数据剖析
- 记录下UIButton的图文妙用和子控件的优先显示
- linux 下启动mysql
- 推荐优秀的SQL脚本调试工具Embarcadero DBArtisan 可以调试SQL Server 2000/2005 SQL调试工具汇总...
- S1.2 Python开发规范指南
- 读取csv绘制直方图_[python]用tushare接口绘制Bollinger Bands
- shell 中常用到的基础命令