Cod sursa(job #1894830)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 27 februarie 2017 16:27:07
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <vector>
#define N 105
using namespace std;

vector<int> g[N],gt[N];
int i,j,n,k,x,ttot;
int d[N],v[N],tmax[N];
bool viz[N];

void dfs(int x)
{
    int i,maxim,y;

    viz[x]=true;
    maxim=0;

    for(i=0;i<g[x].size();i++)
    {
        y=g[x][i];
        if(!viz[y])
            dfs(y);
        if(d[y]>maxim)
            maxim=d[y];
    }

    d[x]=v[x]+maxim;
}

void dfs2(int x)
{
    int i,minim,y;

    viz[x]=true;
    minim=ttot;

    for(i=0;i<gt[x].size();i++)
    {
        y=gt[x][i];
        if(!viz[y])
            dfs2(y);
        if(tmax[y]<minim)
            minim=tmax[y];
    }

    tmax[x]=minim-v[x];
}

int main()
{
    FILE *f1,*f2;
    f1=fopen("pm2.in","r");
    f2=fopen("pm2.out","w");

    fscanf(f1,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(f1,"%d",&v[i]);
    for(i=1;i<=n;i++)
    {
        fscanf(f1,"%d",&k);
        for(j=0;j<k;j++)
        {
            fscanf(f1,"%d",&x);
            g[i].push_back(x);
            gt[x].push_back(i);
        }
    }


    for(i=1;i<=n;i++)
    {
        if(!viz[i])
            dfs(i);
        if(d[i]>ttot)
            ttot=d[i];
    }

    for(i=1;i<=n;i++)
        viz[i]=false;

    for(i=1;i<=n;i++)
        if(!viz[i])
            dfs2(i);

    fprintf(f2,"%d\n",ttot);
    for(i=1;i<=n;i++)
        fprintf(f2,"%d %d\n",d[i]-v[i],tmax[i]);

    return 0;
}