BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)

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。输出矩阵要保证合法,不能发生矛盾。
题解:http://blog.csdn.net/pouy94/article/details/5972444
PS:这题太牛叉了值得一做……
代码(896MS):
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <queue>
  6 using namespace std;
  7 
  8 const int MAXN = 110;
  9 const int MAXV = MAXN * MAXN;
 10 const int MAXE = MAXN * MAXV;
 11 const int INF = 0x7f7f7f7f;
 12 
 13 struct ZWK_FLOW {
 14     int head[MAXV], dis[MAXV];
 15     int to[MAXE], next[MAXE], flow[MAXE], cost[MAXE];
 16     int n, ecnt, st, ed;
 17 
 18     void init() {
 19         memset(head, 0, sizeof(head));
 20         ecnt = 2;
 21     }
 22 
 23     void add_edge(int u, int v, int c, int w) {
 24         to[ecnt] = v; flow[ecnt] = c; cost[ecnt] = w; next[ecnt] = head[u]; head[u] = ecnt++;
 25         to[ecnt] = u; flow[ecnt] = 0; cost[ecnt] = -w; next[ecnt] = head[v]; head[v] = ecnt++;
 26         //printf("%d %d %d %d\n", u, v, c, w);
 27     }
 28 
 29     void spfa() {
 30         for(int i = 1; i <= n; ++i) dis[i] = INF;
 31         priority_queue<pair<int, int> > que;
 32         dis[st] = 0; que.push(make_pair(0, st));
 33         while(!que.empty()) {
 34             int u = que.top().second, d = -que.top().first; que.pop();
 35             if(d != dis[u]) continue;
 36             for(int p = head[u]; p; p = next[p]) {
 37                 int &v = to[p];
 38                 if(flow[p] && dis[v] > d + cost[p]) {
 39                     dis[v] = d + cost[p];
 40                     que.push(make_pair(-dis[v], v));
 41                 }
 42             }
 43         }
 44         int t = dis[ed];
 45         for(int i = 1; i <= n; ++i) dis[i] = t - dis[i];
 46     }
 47 
 48     int minCost, maxFlow;
 49     bool vis[MAXV];
 50 
 51     int add_flow(int u, int aug) {
 52         if(u == ed) {
 53             maxFlow += aug;
 54             minCost += dis[st] * aug;
 55             return aug;
 56         }
 57         vis[u] = true;
 58         int now = aug;
 59         for(int p = head[u]; p; p = next[p]) {
 60             int &v = to[p];
 61             if(flow[p] && !vis[v] && dis[u] == dis[v] + cost[p]) {
 62                 int t = add_flow(v, min(now, flow[p]));
 63                 flow[p] -= t;
 64                 flow[p ^ 1] += t;
 65                 now -= t;
 66                 if(!now) break;
 67             }
 68         }
 69         return aug - now;
 70     }
 71 
 72     bool modify_label() {
 73         int d = INF;
 74         for(int u = 1; u <= n; ++u) if(vis[u]) {
 75             for(int p = head[u]; p; p = next[p]) {
 76                 int &v = to[p];
 77                 if(flow[p] && !vis[v]) d = min(d, dis[v] + cost[p] - dis[u]);
 78             }
 79         }
 80         if(d == INF) return false;
 81         for(int i = 1; i <= n; ++i) if(vis[i]) dis[i] += d;
 82         return true;
 83     }
 84 
 85     int min_cost_flow(int ss, int tt, int nn) {
 86         st = ss, ed = tt, n = nn;
 87         minCost = maxFlow = 0;
 88         spfa();
 89         while(true) {
 90             while(true) {
 91                 for(int i = 1; i <= n; ++i) vis[i] = false;
 92                 if(!add_flow(st, INF)) break;
 93             }
 94             if(!modify_label()) break;
 95         }
 96         return minCost;
 97     }
 98 } G;
 99 
100 int n, m;
101 int mat[MAXN][MAXN], ans[MAXN][MAXN];
102 
103 inline int encode(int i, int j) {
104     if(i > j) swap(i, j);
105     return i * n + j;
106 }
107 
108 int main() {
109     scanf("%d", &n);
110     for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) scanf("%d", &mat[i][j]);
111     m = n * n;
112     int ss = n + m + 1, tt = ss + 1;
113     G.init();
114     int sum = n * (n - 1) * (n - 2) / 6;
115     for(int i = 1; i <= n; ++i) {
116         for(int j = 1, tmp = 1; j < n; ++j, tmp += 2) G.add_edge(ss, i, 1, tmp);
117         for(int j = 1; j <= n; ++j) if(mat[i][j] != 0)
118             ans[i][j] = G.ecnt, G.add_edge(i, encode(i, j), 1, 0);
119     }
120     for(int i = 1; i <= m; ++i) G.add_edge(i + n, tt, 1, 0);
121     int x = G.min_cost_flow(ss, tt, tt);
122     printf("%d\n", sum - (x - n * (n - 1) / 2) / 2);
123     for(int i = 1; i <= n; ++i) {
124         for(int j = 1; j <= n; ++j) {
125             if(j != 1) printf(" ");
126             if(mat[i][j] != 2) printf("%d", mat[i][j]);
127             else {
128                 if(G.flow[ans[i][j]] == 0) printf("1");
129                 else printf("0");
130             }
131         }
132         puts("");
133     }
134 }
View Code

 

 

 

转载于:https://www.cnblogs.com/oyking/p/3330462.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java swt最小化到托盘_SWT 中实现最小化到托盘图标,并只能通过托盘的弹出菜单关闭程序...

package com.unmi;import org.eclipse.swt.*;import org.eclipse.swt.events.*;import org.eclipse.swt.graphics.*;import org.eclipse.swt.widgets.*;/*** SWT 3.0 开始引入了 Tray&#xff0c;可以在系统栏放置你的程序图标了* 本程序实现的功能有四&#xff1a;* 1. 点击窗…

HDU 1476 Sudoku Killer

Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3367 Accepted Submission(s): 1063 Problem Description自从2006年3月10日至11日的首届数独世界锦标赛以后&#xff0c;数独这项游戏越来越受到…

java .net 互通redis_C# servicestack.redis 互通 java jedis

本文是基于jedis的一致性环哈希来修改的&#xff0c;.net选的是servicestack.redis组件来修改无奈两个组件都有各自的一致性环哈希算法&#xff0c;不兼容&#xff0c;那就选一个作为标准&#xff0c;修改另一个咯。本文选择jedis的一致性环哈希作为标准&#xff0c;进而修改.n…

java 多重压缩下载_Java 多文件边压缩边下载

有时我们希望在后台实时生成文件并下载到客户端GetMapping(value "download")public void download(HttpServletResponse response) {try(OutputStream outputStream response.getOutputStream();ZipOutputStream zipOutputStream new ZipOutputStream(outputStre…

wdatepicker使用指南

wdatepicker使用指南 http://blog.csdn.net/zengxin2008/article/details/7248964#t63posted on 2013-09-22 15:45 moonfans 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/moonfans/p/3333251.html

纵表、横表互转的SQL

纵表、横表互转的SQL By&#xff1a;大志若愚 1、建表&#xff1a; 纵表结构 Table_A create table Table_A (姓名 varchar(20),课程 varchar(20),成绩 int ) insert into Table_A(姓名,课程,成绩) values(张三,语文,60) insert into Table_A(姓名,课程,成绩) values(张三,数学…

java按照商品价格排序_按照指定的类型排序

比如有三本书&#xff0c;书名和价格分别如下&#xff1a;《猎物》18.4元、《大明王朝》59.0元、《快乐密码》25.0元。前几天的一篇文章中讲到按照中文拼音进行排序&#xff0c;这里如果想按照价格排序的话怎么办&#xff1f;其实这里就牵涉到在Java中怎样对对象进行排序处理&a…

6款帮助 滚动视差jquery插件

在网页设计中&#xff0c;视差滚动&#xff08;Parallax Scrolling&#xff09;是当下流行的网页设计技术&#xff0c;通过让多层背景以不同的速度或者不同的方向移动来形成非常有趣的 3D 运动效果。下面是一些运用视差滚动效果的优秀网页案例&#xff1a; 视差&#xff08;Pa…

java i线程安全吗_Java中 i++ 是线程安全的么?为什么?

问题在 int i 0; i i; 语句中&#xff0c;i i是线程安全的么&#xff1f;如果不安全&#xff0c;请说明上面操作在JVM中的执行过程&#xff0c;为什么不安全&#xff1f;说出JDK中哪个类能达到以上的效果&#xff0c;并且是线程安全而且高效的&#xff0c;简述其原理。回答语…

EBS 多组织访问设置

如果想让你的职责下为单组织模式&#xff0c;那么你在Profile下只设置MO: Operating Unit的值&#xff0c;MO: Operating Unit提供只访问一个单独的OU。如果你想让你的职责下为多组织模式&#xff0c;你需要设置MO: Security Profile&#xff0c;MO: Security Profile提供多组织…

java第k小元素_java – 如何从对象列表中提取K“最小”元素?

我会对清单进行排序.然后,我将创建一个包含这10个最小对象的列表,并更改原始列表list1以包含其余对象.就像是&#xff1a;Collection.sort(list1);ArrayList yourSmallestElements (ArrayList)(list1.sublist(0, 9).clone());list1.removeAll(yourSmallestElements);注意&…

JQuery学习系列总结—菜单制作

1、页面中的菜单项可以通过嵌套的ul和li来表示 2、菜单最外层为ul&#xff0c;一层每个主菜单放在一个li中&#xff0c;如果有子菜单&#xff0c;在这个主菜单的li中建立新的ul&#xff0c;再依次嵌套即可构建多层的菜单 3、浏览器中ul和li元素默认情况下文字前都有圆点标识符&…

mysql 大量列 动态变量_aardio动态mysql变量设置

aardio动态mysql变量设置aardio动态mysql变量设置废话不多说&#xff0c;直接开始干活&#xff01;从上午度娘到现在&#xff01;终于有点结果&#xff01;需求是从数据库读取数据&#xff0c;根据条件(变量)直接上代码&#xff0c;如有任何问题&#xff0c;欢迎老铁指正&#…

制作简单的java应用程序_使用exe4j工具制作简单的java应用程序

首先需要下载exe4j工具并进行安装&#xff0c;下面是利用exe4j工具制作应用程序的步骤。1.首先将工程导出为可运行的jar包&#xff0c;选择extract required libralies into generated java&#xff0c;会将引用到的jar包也打到里面。右键java工程--export--java--runnable jar…

HDU 4422 The Little Girl who Picks Mushrooms(简单题)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4422 题目大意&#xff1a;小姑娘背着5个包去山上采蘑菇&#xff0c;每座山上只能用一个背包采集。三个小精灵会要她3个背包&#xff0c;其里面蘑菇的数量必须是1024的倍数&#xff0c;否则5个背包都会被拿走。…

Java三维文字特效设计_jQuery实现3D文字特效的方法

本文实例讲述了jQuery实现3D文字特效的方法。分享给大家供大家参考。具体如下&#xff1a;这款基于jQuery的3D文字特效演示&#xff0c;不是真正的3D&#xff0c;是由多个文字形成的3D效果&#xff0c;如果首次加载网页出错的话&#xff0c;请刷新一下页面&#xff0c;当然在使…

MVC的传递数据的方法

1、使用ViewBag 1 #region 0.2 Action方法 ActionResult Index2()2 /// <summary>3 /// Action方法4 /// </summary>5 /// <returns></returns>6 public ActionResult Index2()7 {8 …

java 找不到构造函数_JAVA找不到符号构造函数

JAVA找不到符号构造函数关注:52 答案:2 mip版解决时间 2021-02-05 09:13提问者彼岸独舞2021-02-05 00:06class Rect{private double length;private double width;public Rect(double length,double width){this.widthwidth;this.lengthlength;}public double getLength(){re…

SRF之数据访问

数据访问组件实现实体类和数据表映射、SQL语句配置执行、动态sql语句等功能&#xff0c;ORM方式能实现简单的对象和表的映射&#xff08;配置类似hibernate&#xff09;&#xff0c;但比较单一&#xff08;不支持一对多、多对多的情况&#xff09;&#xff0c;下边不做介绍&…

java 抽象类 方法_java 抽象类

Java为什么使用抽象类和接口Java接口和Java抽象类代表的就是抽象类型&#xff0c;就是我们需要提出的抽象层的具体表现。OOP面向对象的编程&#xff0c;如果要提高程序的复用率&#xff0c;增加程序的可维护性&#xff0c;可扩展性&#xff0c;就必须是面向接口的编程&#xff…