(拓扑图+DP) poj 3249

Test for Job

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 9563   Accepted: 2201

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 profit Vi 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 city iVi (0 ≤ |Vi| ≤ 20000) 
The next m lines each contain two integers xy indicating that there is a road leads from city x 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

Hint

Source

POJ Monthly--2007.07.08, 落叶飞雪

题意

每个点都有权值,然后求 入度为0到出度为0的一条路径,使得权值和最大

显然拓扑排序然后 dp搞就行了啊

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#define INF 100000000
using namespace std;
vector<int> e[100005];
int num[100005],n,m,in[100005],dp[100005],ans;
void topsort()
{
    queue<int> q;
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
        {
            q.push(i);
            dp[i]=num[i];
        }
    }
    while(!q.empty())
    {
        int x;
        x=q.front();
        q.pop();
        bool flag=true;
        for(int i=0;i<e[x].size();i++)
        {
            flag=false;
            int v=e[x][i];
            dp[v]=max(dp[v],dp[x]+num[v]);
            if(--in[v]==0)
            {
                q.push(v);
            }
        }
        if(flag&&dp[x]>ans)
            ans=dp[x];
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ans=-INF;
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]),e[i].clear(),dp[i]=-INF,in[i]=0;
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            e[x].push_back(y);
            in[y]++;
        }
        topsort();
        printf("%d\n",ans);
    }
    return 0;
}

  

时间: 2024-08-29 21:29:56

(拓扑图+DP) poj 3249的相关文章

POJ 3249 Test for Job 拓扑排序+DP

http://poj.org/problem?id=3249 题意: 给一个有向无环图DAG(不一定联通),每个点有权值,入度为0的点为起点,出度为0的点为终点,选择一个起点走到一个终点,使得路上的权和最大. 分析: dp[to] = max(dp[from]) + value[to],然后先拓扑排序保证状态正确转移即可,终点做标记,如果是终点则尝试更新答案. update:因为点权可以为负,所以程序里用dp[i] == -1表示未访问过该点是有问题的,不过没有遇上会卡掉这种情况的数据=.= 1

poj 3249 Test for Job 图上dp(记忆化搜索)

题意: 给一个n个点的DAG,每个点有一个值p,现在要在图上找一个入度为0到出度为0的路径,使路径上的点的p值和最大. 分析: dp[v]记录以点v为起点能获得的最大值,搜一遍即可. 代码: //poj 3249 //sep9 #include <iostream> using namespace std; const int maxN=100024; const int maxM=1000024; int n,m,e; int p[maxN],head[maxN],dp[maxN],vis[

POJ - 3249 Test for Job (DAG+topsort)

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

[dp] poj 1015 Jury Compromise

题目链接: http://poj.org/problem?id=1015 Jury Compromise Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24438   Accepted: 6352   Special Judge Description In Frobnia, a far-away country, the verdicts in court trials are determined by a jury

【BZOJ4011】【HNOI2015】落忆枫音 拓扑图DP,

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/45362029"); } 题解: 如果没有后加的边,那么 ans=∏ni=2di ,可以回忆构建树形数据的普遍方法--点 i 连一条 [1,i-1] 的边即可. 然后后加边了以后,有且仅有一些方案会形成环是错误方案. 拓扑图DP就好啦

BZOJ 3890 Usaco2015 Jan Meeting Time 拓扑图DP

题目大意 题上的中文题意太不明确了... 给出一个拓扑图,每条有向边有两个权值,有两个人从1出发到n,分别走这两种权值.问有没有权值使得这两个人都能走过这些权值到达n. 思路 看懂了题之后就水了.维护两个数组表示从1号节点是否能够通过i的权值到达j.然后做拓扑图DP. CODE #define _CRT_SECURE_NO_WARNINGS #include <queue> #include <cstdio> #include <cstring> #include &l

[kuangbin 基础dp][POJ 1015] Jury Compromise(dp)

[kuangbin 基础dp][POJ 1015] Jury Compromise 题目 In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of members of the general public. Every time a trial is set to begin, a jury has to be selected, which is do

POJ 3249 Test for Job (dfs + dp)

题目链接:http://poj.org/problem?id=3249 题意: 给你一个DAG图,问你入度为0的点到出度为0的点的最长路是多少 思路: 记忆化搜索,注意v[i]可以是负的,所以初始值要-inf. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int N = 1e5 + 5; 6 typedef long long

POJ 3249 拓扑+dp

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9479   Accepted: 2168 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