题目描述
小 void有 N 头奶牛,每头奶牛有个挤奶的时间;且某两头奶牛有挤奶顺序,即:x ,y,则只有在奶牛 x 挤完奶时,才能挤奶牛 y。现在给定 NN头奶牛的挤奶时间,及 M对先后关系,求 N 头奶牛都挤完奶的最早时间。
输入格式
第一行为两个空格隔开的整数 N 和 M。
以下 N 行,第 i+1行表示第 i头奶牛的挤奶时间 T
以下 M 行,每行两个整数 x,y,表示奶牛 x在奶牛 y之前挤奶。保证关系无环,即保证有解。
输出格式
输出共一行一个整数 Ret,N头奶牛都挤完奶的最早时间。
样例输入
3 1
10
5
6
3 2
样例输出
11
样例分析
先挤奶牛 1和 3,第 6 秒时,奶牛 3 挤完了;接着挤奶牛 1 和 2,第 10 秒时,奶牛 1 挤完了,第 11 秒时,奶牛 2 也挤完了。
数据范围
对于30% 的数据:1≤N≤100,1≤M≤50;
对于 100% 的数据:1≤N≤10,000,1≤M≤50,000, 1≤T,i≤100,000。
我的代码QAQ
#include<bits/stdc++.h>
using namespace std;
int chu[10005][10005],t[10005],cen=0,gg[10005],n,m,gen[10005];
int milk(int u)//更新
{
int ans=0;
if(!chu[u])
return t[u];
else
for(int i=1;i<=chu[u][0];i++)
{
if(!gen[chu[u][i]])//如果没有更新就更新
{
gen[chu[u][i]]=1;
t[chu[u][i]]=milk(chu[u][i]);
}
ans=max(ans,t[chu[u][i]]);
}
t[u]+=ans;
gen[u]=1;//标为已更新
return t[u];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>t[i];
for(int i=1;i<=m;i++)
{
int a,b;
cin>>b>>a;
chu[a][0]++;
chu[a][chu[a][0]]=b;//存之前的牛
}
for(int i=1;i<=n;i++)
{
if(!gen[i])//如果已经更新就不需要更新
milk(i);
}
for(int i=1;i<=n;i++)
{
cen=max(cen,t[i]);
}
cout<<cen<<endl;
return 0;
}