Cod sursa(job #214295)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 13 octombrie 2008 20:19:11
Problema Atac Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <queue>
#define infinit 0x3f3f3f

using namespace std;

ifstream fin ("atac.in");
ofstream fout ("atac.out");

struct nod
{
     int inf,cost;
     nod *next;
} *sir[33000];

queue <int > Q;
int n,m,a,b,c,d,z,p,x,y;
int dist[33000],viz[33000];

void baga(int x,int y,int c)
{
     nod *q=new nod;
     q->inf=x;
     q->cost=c;
     q->next=sir[y];
     sir[y]=q;
}

void citire()
{
     int U,V;
     fin>>n>>m>>p;
     for (int i=0;i<n-1;i++)
     {
          fin>>U>>V;
          baga(U,i+2,V);
          baga(i+2,U,V);
     }
     fin>>x>>y>>a>>b>>c>>d;
}

inline int minim(int a,int b)
{
     return a<b?a:b;
}

int f_x()
{
     return (x*a +y*b)%n+1;
}

int f_y()
{
     return (y*c+z*d)%n+1;
}

int afla()
{
     if (x==y)
          return 0;
     memset(dist,infinit,sizeof dist);
     memset(viz,0,sizeof(viz));
     Q.push(x);
     viz[x]=1;
     int min;
     while (!Q.empty() && !viz[y])
     {
          min=Q.front();
          Q.pop();
          for (nod *i=sir[min];i;i=i->next)
          {
               if (!viz[i->inf])
               {
                    viz[i->inf]=1;
                    Q.push(i->inf);
                    dist[i->inf]=minim(dist[min],i->cost);
               }
          }
     }
     while (!Q.empty())
          Q.pop();
     return dist[y];
}

void afisare()
{
     for (int i=1;i<=m-p;i++)
     {
          z=afla();
          x=f_x();
          y=f_y();
     }
     for (int i=0;i<p;i++)
     {
          z=afla();
          fout<<z<<"\n";
          x=f_x();
          y=f_y();
     }
}

int main ()
{
     citire();
     afisare();
     return 0;
}