Cod sursa(job #1874977)

Utilizator gbibBacotiu Gabi gbib Data 10 februarie 2017 16:56:26
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define nmax 15005
using namespace std;
ifstream in("easygraph.in");
ofstream out("easygraph.out");

stack < int > st;
vector <int> v[nmax],transpus[nmax];
int c[nmax];
long long s[nmax];
bool viz[nmax];
void dfs(int nod)
{
    int i;
    viz[nod]=1;
    for(i=0;i<v[nod].size();i++)
        if(!viz[v[nod][i]])
            dfs(v[nod][i]);
    st.push(nod);
}

int main()
{int t,n,i,m,j,a,b;
in>>t;
while(t--)
{
    for(i=1;i<=nmax;i++)
    {
        viz[i]=c[i]=0;
        if(v[i].size())
            v[i].clear();
        if(transpus[i].size())
            transpus[i].clear();
        while(st.size())
            st.pop();
    }

    in>>n>>m;
    for(i=1;i<=n;i++)
        in>>c[i];
    for(i=1;i<=m;i++)
    {
        in>>a>>b;
        v[a].push_back(b);
        transpus[b].push_back(a);
    }

    for(i=1;i<=n;i++)
        if(!viz[i])
            dfs(i);
    long long maxi=LONG_LONG_MIN;
    int nod;
    while(!st.empty())
    {
        nod=st.top();

        st.pop();
        s[nod]=c[nod];
        for(i=0;i<transpus[nod].size();i++)
            s[nod]=max(s[nod],s[transpus[nod][i]]+c[nod]);
        maxi=max(maxi,s[nod]);
    }
    out<<maxi<<'\n';
}
    return 0;
}