Cod sursa(job #220577)

Utilizator savimSerban Andrei Stan savim Data 11 noiembrie 2008 17:39:42
Problema Atac Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#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;
}