Pagini recente » Cod sursa (job #2942751) | Cod sursa (job #2335798) | Cod sursa (job #2361932) | Cod sursa (job #3265444) | Cod sursa (job #557988)
Cod sursa(job #557988)
#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;}