link:http://poj.org/problem?id=3249
在拓扑排序的过程中进行状态转移,dp[i]表示从起点到 i 这个点所得到的的最大值。比如从u点到v点,dp[v]=max(dp[v], dp[u]+a[v]) a[]数组是点的价值,最终的dp[]数组里面的最大值就是所求的。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 #include <queue> 9 #include <deque> 10 #include <queue> 11 #include <list> 12 #include <map> 13 #include <set> 14 #include <vector> 15 #include <utility> 16 #include <functional> 17 #include <fstream> 18 #include <iomanip> 19 #include <sstream> 20 #include <numeric> 21 #include <cassert> 22 #include <ctime> 23 #include <iterator> 24 const int INF = 0x3f3f3f3f; 25 const int dir[8][2] = {{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 26 #define N 111111 27 using namespace std; 28 int WO[N],NI[N],dp[N],TA[N]; 29 vector<int> V[N]; queue<int> QU; 30 int main(void) 31 { 32 #ifndef ONLINE_JUDGE 33 freopen("in.txt","r",stdin); 34 #endif // ONLINE_JUDGE 35 int n,m; 36 while (~scanf("%d%d",&n,&m)) 37 { 38 int i,j; 39 for(i=0;i<n;++i) 40 { 41 scanf("%d",TA+i); NI[i]=WO[i]=0; V[i].clear(); 42 dp[i]=-INF; 43 } 44 while (m--) 45 { 46 int u,v; 47 scanf("%d%d",&u,&v); u--,v--; 48 NI[v]++,WO[u]++; V[u].push_back(v); 49 } 50 for(i=0;i<n;++i) if(!NI[i]) QU.push(i),dp[i]=TA[i]; 51 while(!QU.empty()) 52 { 53 int tmp=QU.front(); QU.pop(); 54 for(i=0;i<V[tmp].size();++i) 55 { 56 dp[V[tmp][i]]=max(dp[V[tmp][i]],dp[tmp]+TA[V[tmp][i]]); 57 if(--NI[V[tmp][i]]==0) QU.push(V[tmp][i]); 58 } 59 } 60 int ans=-INF; 61 for(i=0;i<n;++i) if(!WO[i]) ans=max(ans,dp[i]); 62 printf("%d\n",ans); 63 } 64 return 0; 65 }
最近变懒了,博客都懒得写了,其实也没什么可写的,o(╯□╰)o