Pagini recente » Cod sursa (job #2845795) | Cod sursa (job #607277) | Cod sursa (job #1970288) | Cod sursa (job #2229163) | Cod sursa (job #410404)
Cod sursa(job #410404)
#include<stdio.h>
#include<vector>
#define inf 2000000000
#define cf 105
using namespace std;
vector <int> t[cf],f[cf];
int mic[cf],cost[cf],mx,mn,i,j,m,n,x,y,k,c[cf],mare[cf],viz[cf];
void dfs(int nod)
{
int N;
//p=c[nod];
viz[nod]=1;
N=f[nod].size();
for(int j=0;j<N;j++)
if(!viz[f[nod][j]])
dfs(f[nod][j]);
c[k--]=nod;
}
int padre()
{
int p,N;
p=c[i];
N=f[p].size();
mn=inf;
for(j=0;j<N;j++)
if(mare[f[p][j]]<mn)
mn=mare[f[p][j]];
return mn;
}
int main()
{
freopen("pm2.in","r",stdin);
freopen("pm2.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&cost[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&m);
if(!m)
{
f[0].push_back(i);
t[i].push_back(0);
}
for(j=1;j<=m;j++)
{
scanf("%d",&x);
t[i].push_back(x);
f[x].push_back(i);
}
}
k=n;
dfs(0);
k=n;
for(i=1;i<=k;i++)
{
int p,N;
p=c[i];
N=t[p].size();
mx=-1;
for(j=0;j<N;j++)
if(mic[t[p][j]]+cost[t[p][j]]>mx)
mx=mic[t[p][j]]+cost[t[p][j]];
mic[p]=mx;
}
for(i=1;i<=k;i++)
if(mic[i]+cost[i]>mx)mx=mic[i]+cost[i];
printf("%d\n",mx);
for(i=k;i>=0;i--)
{
int aux;
aux=padre();
if(aux==inf)
mare[c[i]]=mx-cost[c[i]];
else
mare[c[i]]=aux-cost[c[i]];
}
for(i=1;i<=n;i++)
printf("%d %d\n",mic[i],mare[i]);
return 0;
}