Cod sursa(job #7327)

Utilizator MARCELMIHALCEA MARICEL MARCEL Data 21 ianuarie 2007 13:27:10
Problema Radiatie Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 2.13 kb


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define max(x,y) ( x < y ? y : x )

#define Nmax 15001

struct graf {
 int vf;
 long c; } *G[Nmax];


 long *V[Nmax];


 int n,m,k,niv,deg[Nmax];


 void find( int nod )
  {

int c[Nmax],pr,ul,i,elem,aux,kk;

  niv ++ ;

  V[niv]= ( long * ) calloc ( n +1, sizeof(long) );

  for( i =1 ; i <= n ; i ++ ) V[niv][i]=0;

  V[niv][0]=nod;

  pr=ul=1;
  c[pr]=nod;

 memset( deg, 0 , (n+1)*sizeof(int) );
  deg[nod]=1;


  while ( pr <= ul )
   {

	 elem=c[pr];

	 for( i = 1 ; i <= G[elem][0].vf; i ++ )
		 if( !deg[ G[elem][i].vf ] && ( V[niv][ G[elem][i].vf ] == 0 ||
	 V[niv][ G[elem][i].vf ] >  max( V[niv][elem] , G[elem][i].c ) ) )
		   {
		   c[++ul]=G[elem][i].vf;
		   V[niv][c[ul]] = max( V[niv][elem] , G[elem][i].c );

					kk=ul;
		   while( V[niv][c[kk]] < V[niv][c[kk-1]] || c[kk]==c[kk-1])
				{
				if( c[kk] != c[kk-1] )
				{
				aux=c[kk];
				c[kk]=c[kk-1];
				c[kk-1]=aux;
				}
				kk--;
				}

		   }


	 deg[c[pr]]=1;
	 pr ++;
   }
  }


int main()
{

int i,x,y,kk;
long cost;

FILE *fin=fopen("radiatie.in","r");
FILE *fout=fopen("radiatie.out","w");

fscanf(fin,"%d%d%d",&n,&m,&k);

for(i=1;i<=m;i++)
 {
 fscanf(fin,"%d %d %ld",&x, &y, &cost);
 deg[x]++;
 deg[y]++;
 }
fclose(fin);


 for ( i = 0; i <=n ;i ++ )
  G[i]= ( graf * ) calloc ( (deg[i] +1), sizeof(graf) );


 fin=fopen("radiatie.in","r");

fscanf(fin,"%d%d%d",&n,&m,&k);

for(i=1;i<=m;i++)
 {

 fscanf(fin,"%d%d%ld",&x,&y,&cost);
 G[x][0].vf++;
 G[x][ G[x][0].vf ].vf=y;
 G[x][ G[x][0].vf ].c=cost;

 G[y][0].vf++;
 G[y][ G[y][0].vf ].vf=x;
 G[y][ G[y][0].vf ].c=cost;

 }



  fscanf(fin,"%d%d",&x,&y);

  find(x);

  fprintf(fout,"%ld\n",V[1][y]);

for ( i = 2 ; i <= k ; i ++ )
 {
 fscanf(fin,"%d%d",&x,&y);

  for ( kk =1 ;kk <= niv ; kk ++ )
	 if ( V[kk][x] != V[kk][y] )
		{
		fprintf(fout,"%ld\n", max(V[kk][x],V[kk][y]) );
		break;
		}

   if( kk == niv+1)
	   {
	   find(x);
	   fprintf(fout,"%ld\n", V[kk][y] );
	   }

 }

  fclose(fin);
   fclose(fout);

  return 0;
   }