Pagini recente » Cod sursa (job #2983498) | Cod sursa (job #2753147) | Cod sursa (job #1821453) | Cod sursa (job #1892871) | Cod sursa (job #1882514)
#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];
}