Pagini recente » Cod sursa (job #2281667) | Cod sursa (job #80500) | Cod sursa (job #404210) | Cod sursa (job #1004365) | Cod sursa (job #2369451)
#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;
}