BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)
Description
Input
Output
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int MAXN = ;
- const int MAXV = MAXN * MAXN;
- const int MAXE = MAXN * MAXV;
- const int INF = 0x7f7f7f7f;
- struct ZWK_FLOW {
- int head[MAXV], dis[MAXV];
- int to[MAXE], next[MAXE], flow[MAXE], cost[MAXE];
- int n, ecnt, st, ed;
- void init() {
- memset(head, , sizeof(head));
- ecnt = ;
- }
- void add_edge(int u, int v, int c, int w) {
- to[ecnt] = v; flow[ecnt] = c; cost[ecnt] = w; next[ecnt] = head[u]; head[u] = ecnt++;
- to[ecnt] = u; flow[ecnt] = ; cost[ecnt] = -w; next[ecnt] = head[v]; head[v] = ecnt++;
- //printf("%d %d %d %d\n", u, v, c, w);
- }
- void spfa() {
- for(int i = ; i <= n; ++i) dis[i] = INF;
- priority_queue<pair<int, int> > que;
- dis[st] = ; que.push(make_pair(, st));
- while(!que.empty()) {
- int u = que.top().second, d = -que.top().first; que.pop();
- if(d != dis[u]) continue;
- for(int p = head[u]; p; p = next[p]) {
- int &v = to[p];
- if(flow[p] && dis[v] > d + cost[p]) {
- dis[v] = d + cost[p];
- que.push(make_pair(-dis[v], v));
- }
- }
- }
- int t = dis[ed];
- for(int i = ; i <= n; ++i) dis[i] = t - dis[i];
- }
- int minCost, maxFlow;
- bool vis[MAXV];
- int add_flow(int u, int aug) {
- if(u == ed) {
- maxFlow += aug;
- minCost += dis[st] * aug;
- return aug;
- }
- vis[u] = true;
- int now = aug;
- for(int p = head[u]; p; p = next[p]) {
- int &v = to[p];
- if(flow[p] && !vis[v] && dis[u] == dis[v] + cost[p]) {
- int t = add_flow(v, min(now, flow[p]));
- flow[p] -= t;
- flow[p ^ ] += t;
- now -= t;
- if(!now) break;
- }
- }
- return aug - now;
- }
- bool modify_label() {
- int d = INF;
- for(int u = ; u <= n; ++u) if(vis[u]) {
- for(int p = head[u]; p; p = next[p]) {
- int &v = to[p];
- if(flow[p] && !vis[v]) d = min(d, dis[v] + cost[p] - dis[u]);
- }
- }
- if(d == INF) return false;
- for(int i = ; i <= n; ++i) if(vis[i]) dis[i] += d;
- return true;
- }
- int min_cost_flow(int ss, int tt, int nn) {
- st = ss, ed = tt, n = nn;
- minCost = maxFlow = ;
- spfa();
- while(true) {
- while(true) {
- for(int i = ; i <= n; ++i) vis[i] = false;
- if(!add_flow(st, INF)) break;
- }
- if(!modify_label()) break;
- }
- return minCost;
- }
- } G;
- int n, m;
- int mat[MAXN][MAXN], ans[MAXN][MAXN];
- inline int encode(int i, int j) {
- if(i > j) swap(i, j);
- return i * n + j;
- }
- int main() {
- scanf("%d", &n);
- for(int i = ; i <= n; ++i) for(int j = ; j <= n; ++j) scanf("%d", &mat[i][j]);
- m = n * n;
- int ss = n + m + , tt = ss + ;
- G.init();
- int sum = n * (n - ) * (n - ) / ;
- for(int i = ; i <= n; ++i) {
- for(int j = , tmp = ; j < n; ++j, tmp += ) G.add_edge(ss, i, , tmp);
- for(int j = ; j <= n; ++j) if(mat[i][j] != )
- ans[i][j] = G.ecnt, G.add_edge(i, encode(i, j), , );
- }
- for(int i = ; i <= m; ++i) G.add_edge(i + n, tt, , );
- int x = G.min_cost_flow(ss, tt, tt);
- printf("%d\n", sum - (x - n * (n - ) / ) / );
- for(int i = ; i <= n; ++i) {
- for(int j = ; j <= n; ++j) {
- if(j != ) printf(" ");
- if(mat[i][j] != ) printf("%d", mat[i][j]);
- else {
- if(G.flow[ans[i][j]] == ) printf("");
- else printf("");
- }
- }
- puts("");
- }
- }
BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)的更多相关文章
- bzoj 2597 剪刀石头布 —— 拆边费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 不合法的三个人之间的关系就是一个人赢了两次: 记 \( deg[i] \) 表示第 \ ...
- 【BZOJ-2597】剪刀石头布 最小费用最大流
2597: [Wc2007]剪刀石头布 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1016 Solved: ...
- BZOJ2597 [Wc2007]剪刀石头布(最小费用最大流)
题目大概是说n个人两两进行比赛,问如何安排几场比赛的输赢使得A胜B,B胜C,C胜A这种剪刀石头布的三元组最多. 这题好神. 首先,三元组总共有$C_n^3$个 然后考虑最小化不满足剪刀石头布条件的三元 ...
- BZOJ 2668 [cqoi2012]交换棋子 | 最小费用最大流
传送门 BZOJ 2668 题解 同时分别限制流入和流出次数,所以把一个点拆成三个:入点in(x).中间点mi(x).出点ou(x). 如果一个格子x在初始状态是黑点,则连(S, mi(x), 1, ...
- BZOJ 3876 [AHOI/JSOI2014]支线剧情 (最小费用可行流)
题面:洛谷传送门 BZOJ传送门 题目大意:给你一张有向无环图,边有边权,让我们用任意条从1号点开始的路径覆盖这张图,需要保证覆盖完成后图内所有边都被覆盖至少一次,求覆盖路径总长度的最小值 最小费用可 ...
- 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...
- BZOJ 1927 星际竞速(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1927 题意:一个图,n个点.对于给出的每条边 u,v,w,表示u和v中编号小的那个到编号 ...
- BZOJ 1061 志愿者招募(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布 ...
- bzoj 1877 [SDOI2009]晨跑(最小费用最大流)
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...
- bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1576 Solved: 954[Submit][Statu ...
随机推荐
- ProjectServer如何创建时间表
默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...
- BionicApi 学习笔记
1.内存管理 malloc, realloc, free new, delete2.文件输入操作 fopen, fwrite, fputs, fputc, fprintf, fflush fread, ...
- vi常用命令学习
(1)移动光标 h : 左移光标l : 右移光标j : 下移光标k : 上移光标 w : 移动到下一个单词词头b : 移动到上一个单词词头e : 移动到本单词的尾部 0 :移动到当前行的开端$ :移动 ...
- js替换字符串中的空格,换行符\r\n或\n替换成<br>
为了让回车换行符正确显示,需要将 \n 或 \r\n 替换成 <br>.同样地,将空格替换存 .这里我们通过正则表达式来替换. 一.替换所有的空格.回车换行符 //原始字符串 var s ...
- 洛谷P2052 [NOI2011]道路修建(树形DP)
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...
- EF core 中用lambda表达式和Linq的一些区别
转眼一看,又过了10几天没有写博客了,主要还是没有什么可以写的,因为遇到的问题都不是很有价值.不过最近发现用lambda表达式,比用Linq的代码量会少一些,而且也方便一些.不过两者都差不多,相差不是 ...
- 前端之Vue.js库的使用
vue.js简介 Vue.js读音 /vjuː/, 类似于 view Vue.js是前端三大新框架:Angular.js.React.js.Vue.js之一,Vue.js目前的使用和关注程度在三大框架 ...
- centos7-mongodb3.4.6集群的搭建
0.需要环境 安装包:mongodb-linux-x86_64-3.4.6.tgz 安装路径:/usr/mongodb 服务器: 192.168.177.131/132/133 mongos 2000 ...
- Chrome Google 快捷键
窗口和标签页快捷方式 Ctrl+N 打开新窗口 按住 Ctrl 键,然后点击链接 在新标签页中打开链接 按住 Shift 键,然后点击链接 在新窗口中打开链接 Alt+F4 关闭当前窗口 Ctrl+ ...
- Laravel 5.5搭建(lunix-ubuntu)
基本配置 PHP >= 7.0.0 PHP OpenSSL 扩展 PHP PDO 扩展 PHP Tokenizer 扩展 PHP XML 扩展 1:nginx sudo apt-get upda ...