#拓扑排序#有哪位BIG佬知道为什么会Segmentaition faultQAQ

题目描述
小 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;
}

第43题-[拓扑排序]Milk Scheduling_2017gdgzoi999的博客-CSDN博客 题目描述小A有N头奶牛,每头奶牛有个挤奶的时间;且某两头奶牛有挤奶顺序,即:xy,则只有在奶牛x挤完奶时,才能挤奶牛y。现在给定N头奶牛的挤奶时间,及M对先后关系,求N头奶牛都挤完奶的最早时间。输入第一行为两个空格隔开的整数N和M。以下N行,第i+1行表示第i头奶牛的挤奶时间T_i;以下M行,每行两个整数x,y,表示奶牛x在奶牛y之前挤奶。保证关系无环,即保证有解。输出... https://blog.csdn.net/drtlstf/article/details/81117031