bzoj2597: [Wc2007]剪刀石头布
Description
Input
Output
Sample Input
0 1 2
0 0 2
2 2 0
Sample Output
0 1 0
0 0 1
1 0 0
HINT
100%的数据中,N≤ 100。
题解:
Orz PoPoQQQ 补集转化太神了
http://blog.csdn.net/PoPoQQQ/article/details/42424307
code:
- #include<cstdio>
- #include<iostream>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #define maxn 11000
- #define maxm 60000
- #define inf 1061109567
- using namespace std;
- char ch;
- bool ok;
- void read(int &x){
- for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
- for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
- if (ok) x=-x;
- }
- int n,win[],lose[],g[][],sum;
- struct zkw_costflow{
- int s,t,tot,now[maxn],son[maxm],pre[maxm],val[maxm],cost[maxm];
- int dis[maxn],tmp,totflow,totcost;
- bool bo[maxn];
- void init(){s=,t=n*n+n+,tot=,memset(now,,sizeof(now));}
- void put(int a,int b,int c,int d){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c,cost[tot]=d;}
- void add(int a,int b,int c,int d){put(a,b,c,d),put(b,a,,-d);}
- int dfs(int u,int rest,int totval){
- bo[u]=;
- if (u==t){totcost+=rest*totval;return rest;}
- int ans=;
- for (int p=now[u],v=son[p];p&&rest;p=pre[p],v=son[p])
- if (val[p]&&!bo[v]&&dis[v]==dis[u]+cost[p]){
- int d=dfs(v,min(rest,val[p]),totval+cost[p]);
- val[p]-=d,val[p^]+=d,ans+=d,rest-=d;
- }
- return ans;
- }
- bool relax(){
- int d=inf;
- for (int u=s;u<=t;u++) if (bo[u])
- for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
- if (val[p]&&!bo[v]) d=min(d,cost[p]+dis[u]-dis[v]);
- if (d==inf) return false;
- for (int u=s;u<=t;u++) if (!bo[u]) dis[u]+=d;
- return true;
- }
- void work(){
- memset(dis,,sizeof(dis)),totflow=totcost=;
- do{
- do{
- memset(bo,,sizeof(bo));
- tmp=dfs(s,inf,),totflow+=tmp;
- }while (tmp);
- }while (relax());
- }
- void solve(){
- for (int u=;u<=n*n;u++) if (now[u]){
- int p1=now[u],v1=son[p1]-n*n,p2=pre[p1],v2=son[p2]-n*n;
- if (!val[p1]) g[v1][v2]=,g[v2][v1]=;
- else g[v2][v1]=,g[v1][v2]=;
- }
- }
- }f;
- int main(){
- read(n),f.init();
- for (int i=;i<=n;i++) for (int j=;j<=n;j++){
- read(g[i][j]);
- if (g[i][j]==) win[i]++; else if (g[i][j]==) lose[i]++;
- }
- for (int i=;i<=n;i++) sum+=win[i]*(win[i]-)/;
- for (int i=;i<=n;i++) for (int j=win[i];j<n-lose[i];j++) f.add(n*n+i,f.t,,j);
- for (int i=;i<=n;i++) for (int j=i+;j<=n;j++) if (g[i][j]==)
- f.add(f.s,(i-)*n+j,,),f.add((i-)*n+j,n*n+i,,),f.add((i-)*n+j,n*n+j,,);
- f.work();
- printf("%d\n",n*(n-)*(n-)/-f.totcost-sum);
- f.solve();
- for (int i=;i<=n;i++,puts("")) for (int j=;j<=n;j++) printf("%d ",g[i][j]);
- return ;
- }
bzoj2597: [Wc2007]剪刀石头布的更多相关文章
- [bzoj2597][Wc2007]剪刀石头布_费用流
[Wc2007]剪刀石头布 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 题解: 发现直接求三元环不好求,我们考虑任选三个点不是 ...
- BZOJ2597 WC2007剪刀石头布(费用流)
考虑使非剪刀石头布情况尽量少.设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种.那么使Σxi(xi-1)/2尽量小即可. 考虑网络流.将比赛建成一排点,人建成一排点, ...
- BZOJ2597 [Wc2007]剪刀石头布(最小费用最大流)
题目大概是说n个人两两进行比赛,问如何安排几场比赛的输赢使得A胜B,B胜C,C胜A这种剪刀石头布的三元组最多. 这题好神. 首先,三元组总共有$C_n^3$个 然后考虑最小化不满足剪刀石头布条件的三元 ...
- BZOJ2597 [Wc2007]剪刀石头布 【费用流】
题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...
- bzoj2597: [Wc2007]剪刀石头布(费用流)
传送门 不得不说这思路真是太妙了 考虑能构成三元组很难,那我们考虑不能构成三元组的情况是怎么样 就是说一个三元组$(a,b,c)$,其中$a$赢两场,$b$赢一场,$c$没有赢 所以如果第$i$个人赢 ...
- 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流
[BZOJ2597][Wc2007]剪刀石头布 Description 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之 ...
- 【BZOJ-2597】剪刀石头布 最小费用最大流
2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1016 Solved: ...
- 2597: [Wc2007]剪刀石头布
2597: [Wc2007]剪刀石头布 链接 分析: 费用流. 首先转化一下问题,整张图最优的情况是存在$C_n^3$个,即任意3个都行,然后考虑去掉最少不满足的三元环. 如果u赢了v,u向v连一条边 ...
- [Wc2007]剪刀石头布
[Wc2007]剪刀石头布 http://www.lydsy.com/JudgeOnline/problem.php?id=2597 Time Limit: 20 Sec Memory Limit: ...
随机推荐
- WinForm中TextBox 中判断扫描枪输入与键盘输入
本文转载:http://www.cnblogs.com/Hdsome/archive/2011/10/28/2227712.html 提出问题:在收货系统中,常常要用到扫描枪扫描条码输入到TextBo ...
- 在hibernate中使用SQL语句
- 如何将ER图转换成关系模式集
在ER图中,主要是实体类型和联系类型. 1.实体类型的转换 (“——”表示对应关系) 实体类型——关系模式 实体的属性——关系模式的属性 实体标识符——关系模式的键 2.联系的转换 一元联系较简单,三 ...
- 由 argv引出的main参数 分类: C/C++ 2014-11-08 18:00 154人阅读 评论(0) 收藏
我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...
- js获取键盘的keyCode-------Day42
济南今天是大雨倾盆啊,这闷热一扫而空,只是有些电闪雷鸣的,原想在公司里就完毕今天的博客记录的,只是不知道为什么怎么也登不上博客,预计是CSDN当时的server出问题了吧,好在到了晚上,这雷声小了也少 ...
- [RxJS] Filtering operator: single, race
Single, race both get only one emit value from the stream. Single(fn): const source = Rx.Observable. ...
- Linux 常用命令使用方法大搜刮(转)
1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境. 退出当前shel ...
- android 50 进程优先级
程序在磁盘叫程序,程序加载到内存运行起来叫进程,优先级5个级别,内存不足的时候会杀掉低级别进程. Active Process:最上面用户可以操作的. Visible Process:可见进程,部分可 ...
- Cocos2d各版本搭建环境中的奇葩操作
#Version: Cocos2d-x 3.4 Android 将[Cocos2d-x解压目录]\cocos\platform\android\java\src中的com,org目录拷贝覆盖到[项目根 ...
- [转] 使用git自动部署简单网站
要做什么 假设你有一个博客,有一台网站服务器(或者很多台作负载均衡的服务器),当你的博客要升级时,你可能要在你自己的电脑上写好代码(可能包括本地调试好),然后提交到git(或svn),然后在每个服务器 ...