Pagini recente » Cod sursa (job #2774619) | Cod sursa (job #2472791) | Cod sursa (job #1656336) | Cod sursa (job #2195854) | Cod sursa (job #220577)
Cod sursa(job #220577)
#include <stdio.h>
#include <vector>
using namespace std;
#define MAX_N 32010
int n,m,p, X, Y, Z, A, B, C, D, i,j, x, y, lca, cost, k;
int fol[MAX_N], tata[MAX_N];
vector <int> a[MAX_N], c[MAX_N];
void dfs(int k) {
int l = a[k].size();
for (int i = 0; i < l; i++)
if (fol[a[k][i]] == 0) {
fol[a[k][i]] = 1; tata[a[k][i]] = k;
dfs(a[k][i]);
fol[a[k][i]] = 0;
}
}
int main() {
freopen("atac.in","r",stdin);
freopen("atac.out","w",stdout);
scanf("%d %d %d", &n, &m, &p);
for (i = 1; i < n; i++) {
scanf("%d %d", &x, &y);
a[x].push_back(i + 1); c[x].push_back(y);
a[i + 1].push_back(x); c[i + 1].push_back(y);
}
scanf("%d %d %d %d %d %d", &X, &Y, &A, &B, &C, &D);
fol[1] = 1;
dfs(1);
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) fol[j] = 0;
j = X;
while (j) {
fol[j] = 1;
j = tata[j];
}
j = Y;
while (j) {
if (fol[j] == 1) {
lca = j;
break;
}
else j = tata[j];
}
if (X == Y) Z = 0;
else {
Z = (1 << 31) - 1;
j = X;
while (j != lca) {
int l = a[j].size();
for (k = 0; k <= l; k++)
if (a[j][k] == tata[j]) {
if (c[j][k] < Z) Z = c[j][k];
break;
}
j = tata[j];
}
j = Y;
while (j != lca) {
int l = a[j].size();
for (k = 0; k <= l; k++)
if (a[j][k] == tata[j]) {
if (c[j][k] < Z) Z = c[j][k];
break;
}
j = tata[j];
}
}
if (m - p < i) printf("%d\n",Z);
X = ((long long) X*A + Y*B) % n + 1;
Y = ((long long) Y*C + Z*D) % n + 1;
}
return 0;
}