Cod sursa(job #2369451)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 5 martie 2019 23:27:05
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb

#include <fstream>

#include <vector>



#define input "pm2.in"

#define output "pm2.out"

#define NMAX 105



using namespace std;



ifstream in(input);

ofstream out(output);



vector < int > muchii[NMAX];

vector < int > muchii_gt[NMAX];

int timer[NMAX], N, minim[NMAX], maxim[NMAX];

bool uz[NMAX];



int Max(int a, int b)

{

	return a > b ? a : b;

}



int Min(int a, int b)

{

	return a < b ? a : b;

}



void Read_Data()

{

	in >> N;

	for (int i = 1; i <= N; i++)

		in >> timer[i];

	for (int i = 1; i <= N; i++)

	{

		int M, x; in >> M;

		for (int j = 1; j <= M; j++)

		{

			in >> x;

			muchii[i].push_back(x);

			muchii_gt[x].push_back(i);

		}

	}

	for (int i = 1; i <= N; i++)

	{

		muchii[N + 1].push_back(i);

		muchii_gt[0].push_back(i);

	}

}



void DFS_minim(int nod)

{

	uz[nod] = 1;

	for (unsigned i = 0; i < muchii[nod].size(); i++)

	{

		int new_nod = muchii[nod][i];

		if (!uz[new_nod]) DFS_minim(new_nod);

		minim[nod] = Max(minim[nod], minim[new_nod] + timer[new_nod]);

	}

}



void DFS_maxim(int nod)

{

	uz[nod] = 1;

	maxim[nod] = minim[N + 1] - timer[nod];

	for (unsigned i = 0; i < muchii_gt[nod].size(); i++)

	{

		int new_nod = muchii_gt[nod][i];

		if (!uz[new_nod]) DFS_maxim(new_nod);

		maxim[nod] = Min(maxim[nod], maxim[new_nod] - timer[nod]);

	}

}



void Solve()

{

	DFS_minim(N + 1);

	for (int i = 1; i <= N; i++)

		uz[i] = 0;

	DFS_maxim(0);

	out << minim[N + 1] << "\n";

	for (int i = 1; i <= N; i++)

		out << minim[i] << " " << maxim[i] << "\n";

}



int main()

{

	Read_Data();

	Solve();

	return 0;

}