POJ - 3249 Test for Job (DAG+topsort)
2015-12-18 20:11
357 查看
Description
Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job, since there are swelling numbers of the unemployed. So some companies often use hard tests for their recruitment.
The test is like this: starting from a source-city, you may pass through some directed roads to reach another city. Each time you reach a city, you can earn some profit or pay some fee, Let this process continue until you reach a target-city. The boss will
compute the expense you spent for your trip and the profit you have just obtained. Finally, he will decide whether you can be hired.
In order to get the job, Mr.Dog managed to obtain the knowledge of the net profitVi of all cities he may reach (a negative
Vi indicates that money is spent rather than gained) and the connection between cities. A city with no roads leading to it is a source-city and a city with no roads leading to other cities is a target-city. The mission of Mr.Dog is to start
from a source-city and choose a route leading to a target-city through which he can get the maximum profit.
Input
The input file includes several test cases.
The first line of each test case contains 2 integers n and m(1 ≤n ≤ 100000, 0 ≤
m ≤ 1000000) indicating the number of cities and roads.
The next n lines each contain a single integer. The ith line describes the net profit of the cityi,
Vi (0 ≤ |Vi| ≤ 20000)
The next m lines each contain two integers x, y indicating that there is a road leads from cityx to city
y. It is guaranteed that each road appears exactly once, and there is no way to return to a previous city.
Output
The output file contains one line for each test cases, in which contains an integer indicating the maximum profit Dog is able to obtain (or the minimum expenditure to spend)
Sample Input
Sample Output
题意:一个人去找工作遇到了一道面试题。面试官要求给出一些城市和城市之间的道路,每到达一个城市。可能会赚一些钱,可是也可能会有损失。
终于面试者的所得会决定他能否得到这份工作。显而易见,越多越好。
思路:由于是有向无环图(DAG)并且事实上求的是从一个0入度到0出度的路径,所以我们能够用topsort来处理,再加上简单的DP 即可了
Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job, since there are swelling numbers of the unemployed. So some companies often use hard tests for their recruitment.
The test is like this: starting from a source-city, you may pass through some directed roads to reach another city. Each time you reach a city, you can earn some profit or pay some fee, Let this process continue until you reach a target-city. The boss will
compute the expense you spent for your trip and the profit you have just obtained. Finally, he will decide whether you can be hired.
In order to get the job, Mr.Dog managed to obtain the knowledge of the net profitVi of all cities he may reach (a negative
Vi indicates that money is spent rather than gained) and the connection between cities. A city with no roads leading to it is a source-city and a city with no roads leading to other cities is a target-city. The mission of Mr.Dog is to start
from a source-city and choose a route leading to a target-city through which he can get the maximum profit.
Input
The input file includes several test cases.
The first line of each test case contains 2 integers n and m(1 ≤n ≤ 100000, 0 ≤
m ≤ 1000000) indicating the number of cities and roads.
The next n lines each contain a single integer. The ith line describes the net profit of the cityi,
Vi (0 ≤ |Vi| ≤ 20000)
The next m lines each contain two integers x, y indicating that there is a road leads from cityx to city
y. It is guaranteed that each road appears exactly once, and there is no way to return to a previous city.
Output
The output file contains one line for each test cases, in which contains an integer indicating the maximum profit Dog is able to obtain (or the minimum expenditure to spend)
Sample Input
6 5 1 2 2 3 3 4 1 2 1 3 2 4 3 4 5 6
Sample Output
7
题意:一个人去找工作遇到了一道面试题。面试官要求给出一些城市和城市之间的道路,每到达一个城市。可能会赚一些钱,可是也可能会有损失。
终于面试者的所得会决定他能否得到这份工作。显而易见,越多越好。
思路:由于是有向无环图(DAG)并且事实上求的是从一个0入度到0出度的路径,所以我们能够用topsort来处理,再加上简单的DP 即可了
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> using namespace std; const int maxn = 100005; const int inf = 0x3f3f3f3f; struct Node { int v, next; }node[maxn*20]; int n, m, cnt; int profit[maxn]; int ind[maxn], out[maxn], dp[maxn], adj[maxn]; void topsort() { queue<int> q; for (int i = 1; i <= n; i++) if (ind[i] == 0) { q.push(i); dp[i] = profit[i]; } while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = adj[cur]; i != -1; i = node[i].next) { int v = node[i].v; if (dp[v] < dp[cur]+profit[v]) dp[v] = dp[cur]+profit[v]; if (--ind[v] == 0) q.push(v); } } } int main() { while (scanf("%d%d", &n, &m) != EOF) { cnt = 0; memset(adj, -1, sizeof(adj)); memset(ind, 0, sizeof(ind)); memset(out, 0, sizeof(out)); for (int i = 1; i <= n; i++) { dp[i] = -inf; scanf("%d", &profit[i]); } for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); out[a]++; ind[b]++; node[cnt].v = b; node[cnt].next = adj[a]; adj[a] = cnt++; } topsort(); int ans = -inf; for (int i = 1; i <= n; i++) if (out[i] == 0 && dp[i] > ans) ans = dp[i]; printf("%d\n", ans); } return 0; }
相关文章推荐
- Hadoop谁在用?
- Hadoop能做什么?
- 关于网站页面重复的问题
- Hadoop 是什么?
- linux指令-新人累积
- 源码安装nginx
- linux内核3.4基于wakeup_source的autosleep机制分析
- linux内核3.4基于wakeup_source的autosleep机制分析
- linux命令学习(1)
- 一个较好的资料收编网站
- Deep Learning in a Nutshell: History and Training
- Mininet加强版——DOT(分布式OpenFlow试验平台)
- 第三方支付架构设计之―帐户体系
- SELinux policy问题解决思路总结
- centos下pg_dump的服务器版本不匹配问题
- sqoop导入数据地图-reduce job分析
- nginx与zookeeper交互,同步数据,发送系统负载信息。
- 解决apache+tomcatserver环境中文乱码的问题
- Shell 字符串比较
- 检测linux服务器性能常用命令