Ural 1774 Barber of the Army of Mages 最大流
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1774
1774. Barber of the Army of Mages
Memory limit: 64 MB
Input
Output
Samples
| input | output |
|---|---|
3 2 |
Yes |
2 1 |
No |
题意
有很多人要剃胡子,有个很神奇的理发师,可以在每分钟给k个人护理。每个人必须被护理两次。给你每个人进入理发店的时间和耐心,输出在什么时候给这些人剪胡子。
题解
发现时间只有1000,那么可以每一分钟建立一个节点,然后连到人的节点上,容量为1,表示每个人1分钟最多被护理一次;每个人连接一条边到T,容量为2,表示每个人需要被护理两次;从S连接容量为k的边到每个时间,表示每一分钟可以处理k个人。然后跑一发Dinic,最后在残余网络上找解就好。详见代码:
代码
#include<iostream>
#include<stack>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAX_V 4567
#define MAX_N 10004
#define INF 2500005
using namespace std; struct edge{int to,cap,rev;bool isRev;}; vector<edge> G[MAX_N];
int level[MAX_V];
int iter[MAX_V]; void add_edge(int from,int to,int cap) {
G[from].push_back((edge) {to, cap, G[to].size(),});
G[to].push_back((edge) {from, , G[from].size() - ,});
} void bfs(int s) {
memset(level, -, sizeof(level));
queue<int> que;
level[s] = ;
que.push(s);
while (!que.empty()) {
int v = que.front();
que.pop();
for (int i = ; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[e.to] < ) {
level[e.to] = level[v] + ;
que.push(e.to);
}
}
}
} int dfs(int v,int t,int f) {
if (v == t)return f;
for (int &i = iter[v]; i < G[v].size(); i++) {
edge &e = G[v][i];
if (e.cap > && level[v] < level[e.to]) {
int d = dfs(e.to, t, min(f, e.cap));
if (d > ) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
} int max_flow(int s,int t) {
int flow = ;
for (; ;) {
bfs(s);
if (level[t] < )return flow;
memset(iter, , sizeof(iter));
int f;
while ((f = dfs(s, t, INF)) > ) {
flow += f;
}
}
} int n,k;
int t[MAX_N],r[MAX_N];
int m=; int S=;
int T=; int ans[MAX_N][]; int main() {
scanf("%d%d", &n, &k);
memset(ans, -, sizeof(ans));
for (int i = ; i < n; i++) {
scanf("%d%d", &t[i], &r[i]);
for (int j = ; j < r[i]; j++)
add_edge(j + t[i], i + m, );
}
for (int i = ; i < m; i++)add_edge(S, i, k);
for (int i = ; i < n; i++)add_edge(i + m, T, ); int f = max_flow(S, T);
if (f != * n) {
cout << "No" << endl;
return ;
}
printf("Yes\n");
for (int i = ; i < m; i++) {
for (int j = ; j < G[i].size(); j++) {
if(G[i][j].isRev||(G[i][j].cap==))continue;
int u = G[i][j].to - m;
if (ans[u][] == -)ans[u][] = i;
else if (ans[u][] == -)ans[u][] = i;
}
}
for (int i = ; i < n; i++)
printf("%d %d\n", ans[i][], ans[i][]);
return ;
}
Ural 1774 Barber of the Army of Mages 最大流的更多相关文章
- URAL 1774 A - Barber of the Army of Mages 最大流
A - Barber of the Army of MagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/v ...
- ural 1090 In the Army Now
http://acm.timus.ru/problem.aspx?space=1&num=1090 #include <cstdio> #include <cstring&g ...
- Harmonious Army
Harmonious Army Now, Bob is playing an interesting game in which he is a general of a harmonious arm ...
- poj 3069 Saruman's Army
Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8477 Accepted: 4317 De ...
- poj3069 Saruman's Army
http://poj.org/problem?id=3069 Saruman the White must lead his army along a straight path from Iseng ...
- 1472. Martian Army
http://acm.timus.ru/problem.aspx?space=1&num=1472 题目大意: 一颗树,根节点(1) 的值为 1.0,所有叶子节点的值为 0.0 ,其他节点值任 ...
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- ural 2071. Juice Cocktails
2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...
- ural 2073. Log Files
2073. Log Files Time limit: 1.0 secondMemory limit: 64 MB Nikolay has decided to become the best pro ...
随机推荐
- pycharm-install scipy
懒得装双系统,所以在win7下用pycharm,python2.7 虽然机子本身是64位,但是安装包的时候,我居然需要下载32位的??迷:) 这次装的是scipy.在pycharm里添加不了,根据网上 ...
- R-data.table
data.table可以扩展和增强data.frame的功能,在分组操作和组合时访问速度更快. require(data.table) theDT = data.table(A=1:10, B=let ...
- List删除元素
在单线程环境下的解决办法 public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForCo ...
- asm-offset.h 生成
转自:https://blog.csdn.net/linglongqiongge/article/details/50008301 http://www.cnblogs.com/wendellyi/p ...
- LeetCode(189) Rotate Array
题目 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the arr ...
- Java学习——面对对象的思想入门
本文是看过<head first Java>之后的一点感悟,写点东西帮忙以后回忆,Java目前在我的工作中用到还不多,而我又对面对对象的编程非常的感兴趣.曾经在MFC平台上写过 ...
- BZOJ 5336: [TJOI2018]party
状压最长公共子序列的DP数组,一维最多K(15)个数,且相邻两个数的差不超过1,2^15种状态,预处理转移 #include<cstdio> #include<algorithm&g ...
- JAVA 基础--开发环境 vscode 搭建
对于使用 Visual Studio Code 的 Java 开发者来说,Language Support for Java(TM) by Red Hat 扩展提供了非常好的语言特性支持,比如智能感知 ...
- day05 模块以及内置常用模块用法
内置常用模块详解: 1 time 2 datetime 3 random 4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...
- Leetcode 450.删除二叉搜索树的节点
删除二叉搜索树的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引用. 一般来 ...