Cod sursa(job #1882514)

Utilizator radu.leonardoThe Doctor radu.leonardo Data 17 februarie 2017 11:45:40
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("pm2.in");
ofstream g("pm2.out");
int cost[101]= {0},n,m,i,x,v[101],k=0,sol[101]= {0};
vector <int> G[101],G2[101];
bool viz[101]={0};

inline void dfs(int x)
{
    viz[x]=1;
    int sz=G[x].size();
    for(i=0; i<sz; i++)
    {
        int newn=G[x][i];
        if(!viz[newn])  dfs(newn);
    }

    v[++k]=x;

}
inline void toposort()
{
    for(i=0; i<=n; i++)   if(!viz[i])    dfs(i);
    //for(int i=0; i<=n+1; i++) cout<<v[i]<<' ';
}
inline void read_procedure()
{
    f>>n;
    for(int i=1; i<=n; i++) f>>cost[i];

    for(int i=1; i<=n; i++)
    {
        f>>m;
        for(int j=1; j<=m; j++)
        {
            f>>x;
            G[i].push_back(x);
            G2[x].push_back(i);
        }
        if(m==0) G[0].push_back(i),
                 G2[0].push_back(i);
    }

    for(int i=1; i<=n; i++) {if(G2[i].empty()) G[n+1].push_back(i);
                             if(G2[i].empty()) G2[i].push_back(n+1);}
}

inline void forward_pass()
{
    int sz,current,next;
    for(int i=0; i<=n+1; i++)
    {
        current=v[i];
        sz=G[current].size();

        for(int j=0; j<sz; j++) {next=G[current][j];
                                 sol[next]=max(sol[next],sol[current]+cost[current]);

                                 }
    }
}

int main()
{


    read_procedure();
    toposort();
    forward_pass();
//    backward_pass();
    for(int i=0; i<=n+1; i++) cout<<sol[i]<<' ';

    cout<<sol[n+1];
}