Pagini recente » Cod sursa (job #3300200) | Cod sursa (job #2360092) | Cod sursa (job #328431) | Cod sursa (job #3340743) | Cod sursa (job #3315020)
#include <fstream>
#include <cstring>
#include <vector>
#include <climits>
#define DIM 16001
using namespace std;
ifstream fin("asmin.in");
ofstream fout("asmin.out");
int n, k, x, y, mini, cnt, r[DIM], c[DIM];
bool viz[DIM];
vector<int> l[DIM];
void dfs1(int nod, int tata) {
viz[nod] = true;
c[1] += (r[nod] - r[tata] + k) % k;
for (int i = 0; i < l[nod].size(); i++)
if (!viz[l[nod][i]])
dfs1(l[nod][i], nod);
}
void dfs2(int nod, int tata) {
if (nod != 1) {
c[nod] = c[tata] + r[nod] - r[tata];
c[nod] -= (r[nod] - r[tata] + k) % k;
c[nod] += (r[tata] - r[nod] + k) % k;
}
viz[nod] = true;
for (int i = 0; i < l[nod].size(); i++)
if (!viz[l[nod][i]])
dfs2(l[nod][i], nod);
}
int main() {
fin >> n >> k;
for (int i = 1; i < n; i++) {
fin >> x >> y;
l[x].push_back(y);
l[y].push_back(x);
}
for (int i = 1; i <= n; i++)
fin >> r[i];
dfs1(1, 0);
memset(viz, false, sizeof(viz));
dfs2(1, 0);
mini = INT_MAX;
for (int i = 1; i <= n; i++)
if (c[i] < mini) {
mini = c[i];
cnt = 1;
}
else
if (c[i] == mini)
cnt++;
fout << mini << " " << cnt << "\n";
for (int i = 1; i <= n; i++)
if (c[i] == mini)
fout << i << " ";
return 0;
}