1949号题,果然非常良心。
数据已经拓扑排序好了,那我们直接做。
dp[i]表示完成任务i所需的最小时间,易dp[i]=max{dp[pre[i][j]]}+a[i]
,其中pre[i][j]表示i的第j个前需家务。
然后把所有dp值取最大,就是答案了。
#include<cstdio>
using namespace std;
int maxf(int x,int y){return x>y?x:y;}
int minf(int x,int y){return x<y?x:y;}
int dp[100010];
int pre[100010][110];
int a[100010];
int main()
{
int n,m,i,j,k,x,y,z,ans;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
scanf("%d",&pre[i][0]);
for(j=1;j<=pre[i][0];j++)
scanf("%d",&pre[i][j]);
}
for(i=1;i<=n;i++)
{
dp[i]=0;
for(j=1;j<=pre[i][0];j++)
{
dp[i]=maxf(dp[i],dp[pre[i][j]]);
}
dp[i]+=a[i];
}
ans=0;
for(i=1;i<=n;i++)
ans=maxf(ans,dp[i]);
printf("%d
",ans);
return 0;
}
/*
//sample
7
5 0
1 1 1
3 1 2
6 1 1
1 2 2 4
8 2 2 4
4 3 3 5 6
ans:23
*/