Pagini recente » Cod sursa (job #244560) | Cod sursa (job #591925) | Cod sursa (job #1623385) | Cod sursa (job #2694840) | Cod sursa (job #1116620)
#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;
}