Cod sursa(job #7187)

Utilizator mihaif3feier mihai mihaif3 Data 21 ianuarie 2007 13:00:27
Problema Radiatie Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.79 kb
#include <stdio.h>
struct mch
{
  long x,y,c;
  mch* next;
}*ms=NULL;
//-------------------------
long m,n,k, *a,**mm,**cm; 
//-------------------------
long parc(long s, long d)
{                          //printf("parc(%ld,%ld)\n",s,d);
long i,q;
a[s]=1;
for(i=1; i<=mm[s][0]; i++)
   if(mm[s][i]==d) return cm[s][i];
   else if(a[mm[s][i]]==0)
           { q=parc(mm[s][i],d); if(q>0) return (q>=cm[s][i]?q:cm[s][i]); }    
return 0;
}
//-------------------------
int main()
{
long i,j, x1,y1;
mch **p,*cr;
FILE *f=fopen("radiatie.in","rt");
fscanf(f,"%ld %ld %ld",&n,&m,&k);
a=new long[n+1];
for(i=0; i<m; i++)
   {
   cr=new mch;
   fscanf(f,"%ld %ld %ld",&cr->x,&cr->y,&cr->c);
   for(p=&ms; (*p)!=NULL; p=&((*p)->next))
      if((*p)->c>cr->c) break;
   cr->next=(*p);
   *p=cr;   
   }
for(i=1; i<=n; i++) a[i]=0;
for(p=&ms; (*p)!=NULL; )
   if(a[(*p)->x]==0 || a[(*p)->y]==0) {
      a[(*p)->x]=a[(*p)->y]=1;
      p=&((*p)->next); }
   else *p=(*p)->next; 
for(i=1; i<=n; i++) a[i]=0;
for(cr=ms; cr!=NULL; cr=cr->next)
   { a[cr->x]++; a[cr->y]++; }                    
mm=new long*[n+1];
cm=new long*[n+1];
for(i=1; i<=n; i++)
   if(a[i]>0) { 
      mm[i]=new long[a[i]+1]; mm[i][0]=0;
      cm[i]=new long[a[i]+1]; }        
for(cr=ms; cr!=NULL; cr=cr->next) 
   {                          
   mm[cr->x][++mm[cr->x][0]]=cr->y;       
   cm[cr->x][mm[cr->x][0]]=cr->c;
   mm[cr->y][++mm[cr->y][0]]=cr->x;
   cm[cr->y][mm[cr->y][0]]=cr->c;
   }
FILE *fout=fopen("radiatie.out","wt");
for(i=0; i<k; i++)
   {                                 //printf("------- drumul %ld\n",i);
   fscanf(f,"%ld %ld",&x1,&y1);
   for(j=1; j<=n; j++) a[j]=0;
   fprintf(fout,"%ld\n",parc(x1,y1));
   }                                     //getchar(); getchar();
fclose(fout);
}