终于没有打模板题了。
一道简单的拓扑题目(但记得以前第一次做的时候爆0了)。
发现这个做事的过程是按一定顺序的,然后如果一个工作的前面没有任何事情的话,它一定先被完成(如果不的话就不能使时间最小化,其实一点贪心的思想)。
然后更新与它有边连接的,再找没有工作的。
就是个拓扑模板(然而调了半小时)
CODE
#include<cstdio> #include<vector> #include<iostream> using namespace std; const int N=10005,INF=2147483647; vector <int> a[N]; int ru[N],f[N],n,t[N],i,x,ans=-1; inline void read(int &x) { x=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } void dfs(int k) { for (int i=0;i<a[k].size();++i) { int now=a[k][i]; if (f[now]<f[k]+t[now]) f[now]=f[k]+t[now],ans=max(ans,f[now]); if (!(--ru[now])) dfs(now); } } int main() { read(n); for (i=1;i<=n;++i) { read(x); read(t[i]); read(x); while (x) { a[x].push_back(i); ru[i]++; read(x); } f[i]=-INF; } for (i=1;i<=n;++i) if (!ru[i]) f[i]=t[i],dfs(i); printf("%d",ans); return 0; }