Description

在一些一对一游戏的比赛(如下棋、乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况。有的时候,无聊的人们会津津乐道于统计有多少这样的剪刀石头布情况发生,即有多少对无序三元组(A, B, C),满足其中的一个人在比赛中赢了另一个人,另一个人赢了第三个人而第三个人又胜过了第一个人。注意这里无序的意思是说三元组中元素的顺序并不重要,将(A, B, C)、(A, C, B)、(B, A, C)、(B, C, A)、(C, A, B)和(C, B, A)视为相同的情况。
N个人参加一场这样的游戏的比赛,赛程规定任意两个人之间都要进行一场比赛:这样总共有场比赛。比赛已经进行了一部分,我们想知道在极端情况下,比赛结束后最多会发生多少剪刀石头布情况。即给出已经发生的比赛结果,而你可以任意安排剩下的比赛的结果,以得到尽量多的剪刀石头布情况。

Input

输入文件的第1行是一个整数N,表示参加比赛的人数。
之后是一个NN列的数字矩阵:一共N行,每行N列,数字间用空格隔开。
在第(i+1)行的第j列的数字如果是1,则表示i在已经发生的比赛中赢了j;该数字若是0,则表示在已经发生的比赛中i败于j;该数字是2,表示ij之间的比赛尚未发生。数字矩阵对角线上的数字,即第(i+1)行第i列的数字都是0,它们仅仅是占位符号,没有任何意义。
输入文件保证合法,不会发生矛盾,当ij时,第(i+1)行第j列和第(j+1)行第i列的两个数字要么都是2,要么一个是0一个是1。

Output

输出文件的第1行是一个整数,表示在你安排的比赛结果中,出现了多少剪刀石头布情况。
输出文件的第2行开始有一个和输入文件中格式相同的NN列的数字矩阵。第(i+1)行第j个数字描述了ij之间的比赛结果,1表示i赢了j,0表示i负于j,与输入矩阵不同的是,在这个矩阵中没有表示比赛尚未进行的数字2;对角线上的数字都是0。输出矩阵要保证合法,不能发生矛盾。

Sample Input

3
0 1 2
0 0 2
2 2 0

Sample Output

1
0 1 0
0 0 1
1 0 0

HINT

100%的数据中,N≤ 100。

题解:

Orz PoPoQQQ  补集转化太神了

http://blog.csdn.net/PoPoQQQ/article/details/42424307

code:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define maxn 11000
  7. #define maxm 60000
  8. #define inf 1061109567
  9. using namespace std;
  10. char ch;
  11. bool ok;
  12. void read(int &x){
  13. for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
  14. for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
  15. if (ok) x=-x;
  16. }
  17. int n,win[],lose[],g[][],sum;
  18. struct zkw_costflow{
  19. int s,t,tot,now[maxn],son[maxm],pre[maxm],val[maxm],cost[maxm];
  20. int dis[maxn],tmp,totflow,totcost;
  21. bool bo[maxn];
  22. void init(){s=,t=n*n+n+,tot=,memset(now,,sizeof(now));}
  23. 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;}
  24. void add(int a,int b,int c,int d){put(a,b,c,d),put(b,a,,-d);}
  25. int dfs(int u,int rest,int totval){
  26. bo[u]=;
  27. if (u==t){totcost+=rest*totval;return rest;}
  28. int ans=;
  29. for (int p=now[u],v=son[p];p&&rest;p=pre[p],v=son[p])
  30. if (val[p]&&!bo[v]&&dis[v]==dis[u]+cost[p]){
  31. int d=dfs(v,min(rest,val[p]),totval+cost[p]);
  32. val[p]-=d,val[p^]+=d,ans+=d,rest-=d;
  33. }
  34. return ans;
  35. }
  36. bool relax(){
  37. int d=inf;
  38. for (int u=s;u<=t;u++) if (bo[u])
  39. for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
  40. if (val[p]&&!bo[v]) d=min(d,cost[p]+dis[u]-dis[v]);
  41. if (d==inf) return false;
  42. for (int u=s;u<=t;u++) if (!bo[u]) dis[u]+=d;
  43. return true;
  44. }
  45. void work(){
  46. memset(dis,,sizeof(dis)),totflow=totcost=;
  47. do{
  48. do{
  49. memset(bo,,sizeof(bo));
  50. tmp=dfs(s,inf,),totflow+=tmp;
  51. }while (tmp);
  52. }while (relax());
  53. }
  54. void solve(){
  55. for (int u=;u<=n*n;u++) if (now[u]){
  56. int p1=now[u],v1=son[p1]-n*n,p2=pre[p1],v2=son[p2]-n*n;
  57. if (!val[p1]) g[v1][v2]=,g[v2][v1]=;
  58. else g[v2][v1]=,g[v1][v2]=;
  59. }
  60. }
  61. }f;
  62. int main(){
  63. read(n),f.init();
  64. for (int i=;i<=n;i++) for (int j=;j<=n;j++){
  65. read(g[i][j]);
  66. if (g[i][j]==) win[i]++; else if (g[i][j]==) lose[i]++;
  67. }
  68. for (int i=;i<=n;i++) sum+=win[i]*(win[i]-)/;
  69. for (int i=;i<=n;i++) for (int j=win[i];j<n-lose[i];j++) f.add(n*n+i,f.t,,j);
  70. for (int i=;i<=n;i++) for (int j=i+;j<=n;j++) if (g[i][j]==)
  71. f.add(f.s,(i-)*n+j,,),f.add((i-)*n+j,n*n+i,,),f.add((i-)*n+j,n*n+j,,);
  72. f.work();
  73. printf("%d\n",n*(n-)*(n-)/-f.totcost-sum);
  74. f.solve();
  75. for (int i=;i<=n;i++,puts("")) for (int j=;j<=n;j++) printf("%d ",g[i][j]);
  76. return ;
  77. }

bzoj2597: [Wc2007]剪刀石头布的更多相关文章

  1. [bzoj2597][Wc2007]剪刀石头布_费用流

    [Wc2007]剪刀石头布 题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 题解: 发现直接求三元环不好求,我们考虑任选三个点不是 ...

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

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

  3. BZOJ2597 [Wc2007]剪刀石头布(最小费用最大流)

    题目大概是说n个人两两进行比赛,问如何安排几场比赛的输赢使得A胜B,B胜C,C胜A这种剪刀石头布的三元组最多. 这题好神. 首先,三元组总共有$C_n^3$个 然后考虑最小化不满足剪刀石头布条件的三元 ...

  4. BZOJ2597 [Wc2007]剪刀石头布 【费用流】

    题目链接 BZOJ2597 题解 orz思维差 既然是一张竞赛图,我们选出任意三个点都可能成环 总方案数为 \[{n \choose 3}\] 如果三个点不成环,会发现它们的度数是确定的,入度分别为\ ...

  5. bzoj2597: [Wc2007]剪刀石头布(费用流)

    传送门 不得不说这思路真是太妙了 考虑能构成三元组很难,那我们考虑不能构成三元组的情况是怎么样 就是说一个三元组$(a,b,c)$,其中$a$赢两场,$b$赢一场,$c$没有赢 所以如果第$i$个人赢 ...

  6. 【BZOJ2597】[Wc2007]剪刀石头布 最小费用流

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

  7. 【BZOJ-2597】剪刀石头布 最小费用最大流

    2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1016  Solved:  ...

  8. 2597: [Wc2007]剪刀石头布

    2597: [Wc2007]剪刀石头布 链接 分析: 费用流. 首先转化一下问题,整张图最优的情况是存在$C_n^3$个,即任意3个都行,然后考虑去掉最少不满足的三元环. 如果u赢了v,u向v连一条边 ...

  9. [Wc2007]剪刀石头布

    [Wc2007]剪刀石头布 http://www.lydsy.com/JudgeOnline/problem.php?id=2597 Time Limit: 20 Sec  Memory Limit: ...

随机推荐

  1. WinForm中TextBox 中判断扫描枪输入与键盘输入

    本文转载:http://www.cnblogs.com/Hdsome/archive/2011/10/28/2227712.html 提出问题:在收货系统中,常常要用到扫描枪扫描条码输入到TextBo ...

  2. 在hibernate中使用SQL语句

  3. 如何将ER图转换成关系模式集

    在ER图中,主要是实体类型和联系类型. 1.实体类型的转换 (“——”表示对应关系) 实体类型——关系模式 实体的属性——关系模式的属性 实体标识符——关系模式的键 2.联系的转换 一元联系较简单,三 ...

  4. 由 argv引出的main参数 分类: C/C++ 2014-11-08 18:00 154人阅读 评论(0) 收藏

    我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数.C语言规定main函数的参数只能有两个, 习惯上这 ...

  5. js获取键盘的keyCode-------Day42

    济南今天是大雨倾盆啊,这闷热一扫而空,只是有些电闪雷鸣的,原想在公司里就完毕今天的博客记录的,只是不知道为什么怎么也登不上博客,预计是CSDN当时的server出问题了吧,好在到了晚上,这雷声小了也少 ...

  6. [RxJS] Filtering operator: single, race

    Single, race both get only one emit value from the stream. Single(fn): const source = Rx.Observable. ...

  7. Linux 常用命令使用方法大搜刮(转)

    1.# 表示权限用户(如:root),$ 表示普通用户  开机提示:Login:输入用户名  password:输入口令   用户是系统注册用户成功登陆后,可以进入相应的用户环境.  退出当前shel ...

  8. android 50 进程优先级

    程序在磁盘叫程序,程序加载到内存运行起来叫进程,优先级5个级别,内存不足的时候会杀掉低级别进程. Active Process:最上面用户可以操作的. Visible Process:可见进程,部分可 ...

  9. Cocos2d各版本搭建环境中的奇葩操作

    #Version: Cocos2d-x 3.4 Android 将[Cocos2d-x解压目录]\cocos\platform\android\java\src中的com,org目录拷贝覆盖到[项目根 ...

  10. [转] 使用git自动部署简单网站

    要做什么 假设你有一个博客,有一台网站服务器(或者很多台作负载均衡的服务器),当你的博客要升级时,你可能要在你自己的电脑上写好代码(可能包括本地调试好),然后提交到git(或svn),然后在每个服务器 ...