Cod sursa(job #410404)

Utilizator BooZZySandu Bogdan BooZZy Data 4 martie 2010 12:48:46
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#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;
}