Cod sursa(job #29300)

Utilizator dragos_dDiaconescu Dragos dragos_d Data 8 martie 2007 21:28:49
Problema Atac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include "fstream.h"
ifstream f("atac.in");
ofstream g("atac.out");

#define N 32001
#define M 500001
struct muchie
{
   int n1,n2,c;
}mu[N];
long m,p,n,a,b,c,d,viz[N],co[N],v[N],x,y;
void citire()
{
   int i;
   long cost;
   f>>n>>m>>p;
   for(i=1;i<=n-1;i++)
   {
      f>>x>>cost;
      mu[i].n1=x;
      mu[i].n2=i+1;
      mu[i].c=cost;
      viz[i]=1;
   }
   f>>x>>y>>a>>b>>c>>d;
f.close();
}


int cnx()
{
   int i,j,min,max;
   for(i=1;i<=n;i++)
      co[i]=i;
   for(j=1;j<=n-1;j++)
     if(viz[j])
      if(co[mu[j].n1]!=co[mu[j].n2])
      {
	 if(co[mu[j].n1]<co[mu[j].n2])
	 {
	    min=co[mu[j].n1];
	    max=co[mu[j].n2];
	 }
	 else
	 {
	    min=co[mu[j].n2];
	    max=co[mu[j].n1];
	 }
      for(i=1;i<=n;i++)
	 if(co[i]==max)
	     co[i]=min;
      }
   if(co[x]!=co[y])
       return 0;
  return 1;
}
int main()
{
   citire();
   long i,per,min;
   for(i=1;i<=n;i++)
      viz[i]=1;
   for(per=1;per<=m;per++)
   {
     min=M;
     for(i=1;i<n;i++)
     {
	  viz[i]=0;
	  if(!cnx())
	  {
	     if(min>mu[i].c)
		min=mu[i].c;
	     viz[i]=1;
	  }
	  viz[i]=1;
      }
      v[per]=min;
      x=((a*x+y*b)%n)+1;
      y=((y*c+d*v[per])%n)+1;
   }
  for(i=m-p+1;i<=m;i++)
     g<<v[i]<<"\n";
g.close();
return 0;
}