题意:给出一些要做的事情,每件事情做之前需要完成另外一些事情才能做。求完成所有事情需要的最短时间。
思路:第一眼看上去像拓扑排序,但是题目中说第K件事需要提前完成的事情一定在1到K-1之间。endtime[i]=max(endtime[i],endtime[j]+lasttime[i]),其中j是做i需要提前完成的事情。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=10005;
int endtime[maxn];
int lasttime[maxn];
vector<int> pre[maxn];
int main(){
// freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&lasttime[i]);
endtime[i]=lasttime[i];
int c;
scanf("%d",&c);
for(int j=0;j<c;j++)
{
int d;
scanf("%d",&d);
pre[i].push_back(d);
}
}
int ans=endtime[1];
for(int i=2;i<=n;++i)
{
for(int j=0;j<pre[i].size();++j)
{
endtime[i]=max(endtime[i],endtime[pre[i][j]]+lasttime[i]);
}
ans=max(ans,endtime[i]);
}
printf("%d\n",ans);
return 0;
}