URAL 1736 Chinese Hockey 网络流+建图
题目链接:点击打开链接
题意:
给定n个队伍的得分情况,输出随意一个可行解。
n个队伍随意2个队伍 a, b 间有且仅有一场比赛。
比赛结果分4种:
1、a +3, b +0
2、a +0, b +3
3、a +2, b +1
4、a +1, b +2
我们发现事实上每种结果2个队伍得分和总是3 且4种情况就是3的全部拆分和的形式。
所以我们把随意两个队伍组合成一个点。
把n个点连向源点,流上限为该队伍的得分。
对于1,2两个队伍
1 -> 点(1,2) 连流上限为3的边
2 -> 点(1,2) 连流上限为3的边
点(1,2) 到汇点连流上限为3的边。
若满流则有解。
1,2两个队伍间的情况就看点(1,2)的流入情况。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int inf = (int)(1e9);
const int M = 200 + 2;
const int E = M * M * 6 + M * 3;
const int N = M * M + M + 5;
struct Edge {
int from, to, cap, nex;
}; int head[N], egnum;
Edge eg[E]; int a[M], n, st, ed;
int id[M][M], rid[N], tot;
int win[M][M]; void add(int u, int v, int cap, int rw = 0) {
Edge E = {u, v, cap, head[u]};
eg[egnum] = E;
head[u] = egnum++; Edge E2 = {v, u, rw, head[v]};
eg[egnum] = E2;
head[v] = egnum++;
}
int sign[N];
bool bfs(int from, int to) {
memset(sign, -1, sizeof sign);
sign[from] = 0; queue<int> q;
q.push(from);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i != -1; i = eg[i].nex) {
int v = eg[i].to;
if (sign[v] == -1 && eg[i].cap) {
sign[v] = sign[u] + 1;
q.push(v);
if (sign[to] != -1)
return true;
}
}
}
return false;
}
int Stack[N], top, cur[N];
int dicnic(int from, int to) {
int ans = 0;
while (bfs(from, to)) {
memcpy(cur, head, sizeof head);
int u = from;
top = 0;
while (true) {
if (u == to) {
int flow = inf, loc;
for (int i = 0; i < top; ++i)
if (flow > eg[Stack[i]].cap) {
flow = eg[Stack[i]].cap;
loc = i;
}
for (int i = 0; i < top; ++i) {
eg[Stack[i]].cap -= flow;
eg[Stack[i] ^ 1].cap += flow;
}
ans += flow;
top = loc;
u = eg[Stack[top]].from;
}
for (int i = cur[u]; i != -1; cur[u] = i = eg[i].nex)
if (eg[i].cap && (sign[u] + 1 == sign[eg[i].to]))
break;
if (cur[u] != -1) {
Stack[top++] = cur[u];
u = eg[cur[u]].to;
} else {
if (top == 0)
break;
sign[u] = -1;
u = eg[Stack[--top]].from;
}
}
}
return ans;
}
void init() {
memset(head, -1, sizeof head);
egnum = 0;
}
void pu(int x) {
if (x == 0) {
putchar('<');
} else if (x == 1) {
putchar('>');
} else if (x == 2) {
putchar('>');
putchar('=');
} else {
putchar('<');
putchar('=');
}
}
void work() {
int sum = 0, u, v;
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
tot = n;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j) {
id[i][j] = ++tot;
rid[tot] = j;
}
st = ++tot;
ed = ++tot;
init();
for (int i = 0; i < n; ++i)
add(st, i, a[i]);
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j) {
add(i, id[i][j], 3);
add(j, id[i][j], 3);
add(id[i][j], ed, 3);
}
int g = dicnic(st, ed);
if (g != sum) {
puts("INCORRECT");
} else {
memset(win, -1, sizeof win);
puts("CORRECT");
for (int i = 0; i < egnum; ++i) {
if (eg[i].from < n && eg[i].to > n && eg[i].to < st) {
u = eg[i].from;
v = rid[eg[i].to];
if (u == v)
continue;
if (u > v)
std::swap(u, v);
if (win[u][v] == -1) {
if (eg[i].cap == 0) {
win[u][v] = 1; //1 = win, 0 = los, 2 = little win, 3 = little los
} else if (eg[i].cap == 1) {
win[u][v] = 2;
} else if (eg[i].cap == 2) {
win[u][v] = 3;
} else {
win[u][v] = 0;
}
}
}
}
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j) {
printf("%d ", i + 1);
pu(win[i][j]);
printf(" %d\n", j + 1);
}
}
}
int main() {
while (~scanf("%d", &n))
work();
return 0;
}
URAL 1736 Chinese Hockey 网络流+建图的更多相关文章
- URAL 1736 Chinese Hockey(网络最大流)
Description Sergey and Denis closely followed the Chinese Football Championship, which has just come ...
- URAL - 1736 - Chinese Hockey
题意:n支队伍打比赛,每2队只进行1场比赛,规定时间内胜得3分,败得0分,若是打到了加时赛,那么胜得2分,败得1分,给出n支队伍最后的总得分,问这个结果是否是可能的,是的话输出“CORRECT”及各场 ...
- joj 2453 candy 网络流建图的题
Problem D: Candy As a teacher of a kindergarten, you have many things to do during a day, one of whi ...
- [ZJOI2010]贪吃的老鼠(网络流+建图)
题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉.第j只老鼠吃 ...
- 网络流建图(典型)(EK)
题目链接:https://cn.vjudge.net/contest/68128#problem/B 具体思路: 按照 源点 - > 食物 - > 牛1 - > 牛2 - > ...
- hdu-4292.food(类dining网络流建图)
Food Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 4888 Redraw Beautiful Drawings 网络流 建图
题意: 给定n, m, k 以下n个整数 a[n] 以下m个整数 b[n] 用数字[0,k]构造一个n*m的矩阵 若有唯一解则输出这个矩阵.若有多解输出Not Unique,若无解输出Impossib ...
- HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧
题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...
- POJ 1637 Sightseeing tour 建图+网络流
题意: 给定一个混合图,所谓混合图就是图中既有单向边也有双向边,现在求这样的图是否存在欧拉回路. 分析: 存在欧拉回路的有向图,必须满足[入度==出度],现在,有些边已经被定向,所以我们直接记录度数即 ...
随机推荐
- 用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序思路: (1)一圈人循环报数,报数报到3的人,将其置为0,表示被淘汰: (2)那么在接下去的循环中,被淘汰的人不参与报数: (3)直到仅有1人没被淘汰,并显示出他之前的编号. 程序实现如下: cl ...
- php 添加 redis 扩展模块
由于PHP源码中并未有redis的文件,所以需要自己下载. 下载地址: http://pecl.php.net/get/redis-2.2.5.tgz [root@study package]# ta ...
- 通过匹配绑定select option的文本值 模糊匹配
//通过匹配绑定select option的文本值 模糊匹配 $(".class option:contains('文本值')").attr("selected" ...
- 简单随笔——如何在gridview的页脚显示信息。。。。
我是超级大菜鸟...哈哈 先上图看看是不是你需要的 第一步,右击gridview,在事件中,单击RowdataBond事件. 在这之前一定要记得在gridview属性中的ShowFooter设置为“t ...
- SQL Server 2008 忘记sa密码的解决办法
由于某些原因,sa和windows验证都不能登录 sql server,可以用独占模式,修改sa密码先在服务管理器停止Sql Server服务,然后打开命令行,进入 SQL Server安装目录,进入 ...
- 11个有用的移动网页开发App和HTML5框架
在过去的两年里,触屏设备飞速增长.iOS和Android设备让开发者和设计师开始重新思考他们的网页应用,以提供更好的触屏体验. 移动Web应用相对于本地的App有很多优势,虽然也有很多设计和开发上的挑 ...
- synchronized关键字的用法
synchronized用于给方法或者块加锁用的,只有获得该对象或者块的锁的对象才能够执行里面的代码,否则将阻塞在那里,等待该锁被释放,然后获得该锁继续执行.比如下面模拟售票的代码: /** * 模拟 ...
- OpenLayers加载QQ地图(转)
OpenLayers加载QQ地图 http://www.openlayers.cn/portal.php?mod=view&aid=4 2012-10-21 17:22| 发布者: admin ...
- bluestacks安装安卓引擎时出现2502 2503错误的解决办法
2503代表工作站无法启动.2502代表下面的程序调用不支持的MS-DOS函数. 以管理员身份运行命令提示符在经典桌面使用快捷键Win+X,出现一个菜单,选择“命令提示符(管理员) ”即可以以管理员身 ...
- Unicode-字符编码的历史由来(转)
http://www.nowamagic.net/internet/internet_CharsetHistory.php 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以 ...