拓朴排序:
(1)将入度为0的点入栈
(2)while(!stack.empty())
{
node=stack.top();
for(each currentnode与node有边)
{
indegree[currentnode]--(入度减一)
//POJ1949在这里保存currentnode完成的时间,当然是贪心记录最迟完成的时间
if(currentnode的入度为0)
{
stack.push(currentnode);
}
}
}
#include <iostream> #include <cstdio> #include <vector> #include <stack> #include <cstring> using namespace std; const int MAXN=10010; int finishtime[MAXN]; int indegree[MAXN]; int outdegree[MAXN]; int sumtime[MAXN]; int main() { int n; int t; int j; int to; int i; while(scanf("%d",&n)!=EOF) { vector<int> map[MAXN]; stack<int> sta; memset(sumtime,0,sizeof(sumtime)); memset(indegree,0,sizeof(indegree)); for(i=1;i<=n;i++) { scanf("%d",&finishtime[i]); scanf("%d",&t); for(j=0;j<t;j++) { scanf("%d",&to); map[to].push_back(i); indegree[i]++; } } for(i=1;i<=n;i++) { if(indegree[i]==0) { sta.push(i); } } int currentnode; int flag; int currenttime; while(!sta.empty()) { currentnode=sta.top(); //cout<<"currentnode "<<currentnode<<endl; sta.pop(); if(sumtime[currentnode]==0) { sumtime[currentnode]=finishtime[currentnode]; } for(i=0;i<map[currentnode].size();i++) { flag=map[currentnode][i]; indegree[flag]--; // currenttime=sumtime[flag]+finishtime[currentnode]; currenttime=sumtime[currentnode]+finishtime[flag]; if(currenttime>sumtime[flag]) { sumtime[flag]=currenttime; //cout<<flag<<" : "<<sumtime[flag]<<endl; } if(indegree[flag]==0) { sta.push(flag); } } } int ans=0; for(i=1;i<=n;i++) { if(sumtime[i]>ans) { ans=sumtime[i]; } } printf("%d\n",ans); } return 0; }