poj 3249 dp

来源:互联网 发布:软件评测师考试 编辑:程序博客网 时间:2024/06/05 16:09
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;const int M = 100005;const int MAX = 99999999;int dist[M];int rdu[M];int cdu[M];int value[M];vector<int>s[M];int n, m;int ans;void work() {    queue<int>que;    for(int i = 1; i <= n; i++)    if(!rdu[i]) {         que.push(i);         dist[i] = value[i];    }    while(!que.empty()) {        int v = que.front();          que.pop();          for(int i = 0; i < (int)s[v].size(); i++) {                int k = s[v][i];                dist[k] = max(dist[k], dist[v] + value[k]);                rdu[k]--;                if(!rdu[k])                    que.push(k);          }    }}int main(){    int a, b;   while(scanf("%d%d", &n, &m) != EOF) {        for(int i = 1; i <= n; i++) {            scanf("%d", &value[i]);            s[i].clear();            dist[i] = -MAX;            rdu[i] = 0;            cdu[i] = 0;        }        for(int i = 0; i < m; i++) {            scanf("%d%d", &a,&b);            rdu[b]++;            cdu[a]++;            s[a].push_back(b);        }        work();        ans = -MAX;        for(int i = 1; i <= n; i++) {            if(!cdu[i])                ans = max(ans, dist[i]);        }        printf("%d\n", ans);   }    return 0;}

0 0
原创粉丝点击