图上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 }