Cod sursa(job #1116620)

Utilizator horatiu13Horatiu horatiu13 Data 22 februarie 2014 18:32:17
Problema Asmax Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#define Nmax 16005
using namespace std;

FILE *fi = fopen("asmin.in", "r");
FILE *fo = fopen("asmin.out", "w");

struct nod
{
	int x;
	nod *urm;
}*G[Nmax];

int n;
int k;
int r[Nmax];
int sol[Nmax];
int m;
int mn = ~(1<<31);
int sum;
char viz[Nmax];
char vz = 0;

void adauga(int x, int y)
{
	nod *p = new nod;
	p->x = y;
	p->urm = 0;
	
	if (!G[x]) G[x] = p;
	else
	{
		p->urm = G[x];
		G[x] = p;
	}
}

void citire()
{
	int x, y;
	fscanf(fi, "%d%d", &n, &k);
	for (int i = 1; i<n; i++)
	{
		fscanf(fi, "%d%d", &x, &y);
		adauga(x, y);
		adauga(y, x);
	}
	
	for (int i = 1; i<=n; i++)
		fscanf(fi, "%d", &r[i]);
}

void DF(int x, int val)
{
	viz[x] = vz;
	
	if (r[x] >= val)
	{
		sum = sum + r[x] - val;
		val = r[x];
	}
	else
	{
		sum = sum + k + r[x] - val;
		val = k + r[x] - val;
	}
	
	for (nod *p = G[x]; p; p = p->urm)
		if (viz[p->x] != vz)
			DF(p->x, val);
}

int main()
{
	
	citire();
	for (int i = 1; i<=n; i++)
	{
		
		vz = vz? 0 : 1;
		sum = 0;
		
		DF(i, r[i]);
		//printf("%d ", sum);
			
		if (sum < mn)
		{
			mn = sum;
			m = 1;
			sol[m] = i;
		}
		else if (sum == mn)
		{
			sol[++m] = i;
		}
	}
	
	fprintf(fo, "%d %d\n", mn, m);
	for (int i = 1; i<=m; i++)
		fprintf(fo, "%d ", sol[i]);
	return 0;
}