Cod sursa(job #557988)

Utilizator paul992Cirstean Paul paul992 Data 17 martie 2011 00:38:16
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;

const int pinf=0x3f3f3f3f;
vector<int>a[101];
vector<int>at[101];
int n,c[101];
int viz[101],ord[101];
int maxniv[101];

typedef struct timp
{int s,d;};
timp nod[101];

bool cmp(const int &l,const int &r)
{return viz[l]<viz[r];}

void read()
{int x,y;
scanf("%d ",&n);
for(int i=1;i<=n;i++)
	scanf("%d ",&c[i]);
for(int i=1;i<=n;i++)
{ord[i]=i;
scanf("%d ",&x);
if(x==0)
	{a[0].push_back(i);at[i].push_back(0);}
for(int j=1;j<=x;j++)
	{scanf("%d ",&y);
	a[y].push_back(i);
	at[i].push_back(y);
	}
}

}


void bf(int x0)
{int x;
vector<int>::iterator it;
queue<int>q;
viz[x0]=1;

q.push(x0);
while(!q.empty())
{x=q.front();
q.pop();
for(it=a[x].begin();it!=a[x].end();it++)
	{if(nod[x].s+c[x]>nod[*it].s)
		nod[*it].s=nod[x].s+c[x];
	if(viz[*it]==viz[x])
		{viz[*it]=viz[x]+1;
	if(maxniv[viz[*it]]<c[*it])
	maxniv[viz[*it]]=c[*it];}
	if(!viz[*it])
	{viz[*it]=viz[x]+1;
	if(maxniv[viz[*it]]<c[*it])
	maxniv[viz[*it]]=c[*it];
	q.push(*it);}
	}
}
int maxim=0;
for(int i=2;maxniv[i]!=0;i++)
	maxim=maxim+maxniv[i];	
sort(&ord[0],&ord[n+1],cmp);
nod[ord[n]].d=maxim-c[ord[n]];
for(int i=n-1;i>=1;i--)
	if(viz[ord[i]]==viz[ord[n]])
	nod[ord[i]].d=maxim-c[ord[i]];
	else
	nod[i].d=pinf;

for(int i=n;i>=1;i--)
for(it=at[ord[i]].begin();it!=at[ord[i]].end();it++)
	if(nod[*it].d>nod[ord[i]].d-c[*it])
		nod[*it].d=nod[ord[i]].d-c[*it];




printf("%d\n",maxim);
for(int i=1;i<=n;i++)	
	printf("%d %d\n",nod[i].s,nod[i].d);
/*for(int i=1;i<=n;i++)
	printf("%d %d\n",ord[i],viz[ord[i]]);*/
}


int main()
{
freopen("pm2.in","r",stdin);
freopen("pm2.out","w",stdout);
read();

for(int i=0;i<=n;++i)
	if(viz[i]==0)
		bf(i);



return 0;}