图上DP POJ3249

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 int val[100100];
 8 int head[100100];
 9 int dp[100100];
10 int num;
11 bool in[100010];
12 bool en[100010];
13 
14 struct edge
15 {
16     int fro,to,next;
17 }e[10000100];
18 
19 void addEdge(int _fro,int _to)
20 {
21     num++;
22     e[num].fro=_fro;
23     e[num].to=_to;
24     e[num].next=head[_fro];
25     head[_fro]=num;
26 }
27 
28 int dfs(int x)
29 {
30     if(dp[x]!=0)
31         return dp[x];
32     dp[x]=-(1<<29);
33     for(int i=head[x];i!=-1;i=e[i].next)
34     {
35         int v=e[i].to;
36         dfs(v);
37         dp[x]=max(dp[x],dp[v]+val[x]);
38     }
39     return dp[x];
40 }
41 
42 int main()
43 {
44     int n,m;
45     while(scanf("%d%d",&n,&m)!=EOF)
46     {
47         num=0;
48         memset(head,-1,sizeof(head));
49         for(int i=0;i<=n;i++)
50         {
51             in[i]=true;
52             en[i]=true;
53         }
54         for(int i=1;i<=n;i++)
55             scanf("%d",&val[i]);
56         int a,b;
57         for(int i=1;i<=m;i++)
58         {
59             scanf("%d%d",&a,&b);
60             en[b]=false;
61             in[a]=false;
62             addEdge(b,a);
63         }
64         int ans=-(1<<29);
65         memset(dp,0,sizeof(dp));
66         for(int i=1;i<=n;i++)
67         {
68             if(en[i])
69                 dp[i]=val[i];
70         }
71         for(int i=1;i<=n;i++)
72         {
73             if(in[i])
74             {
75                 ans=max(ans,dfs(i));
76             }
77         }
78         cout<<ans<<endl;
79     }
80     return 0;
81 }
View Code

 

posted @ 2015-08-29 20:12  相儒以沫  阅读(188)  评论(0编辑  收藏  举报