Cod sursa(job #7958)

Utilizator georgianaGane Andreea georgiana Data 23 ianuarie 2007 14:27:16
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <string.h>

int n,m,K,x[30000],y[30000],cost[30000],t[15001],h[15001],ch[15001];

void qSort(long int st, long int dr)
{
     long int i=st,j=dr,m=cost[(i+j)/2];
     do
     {
         while (cost[i]<m) i++;
         while (cost[j]>m) j--;
         if (i<=j)
         {
             long int aux=cost[i]; cost[i]=cost[j]; cost[j]=aux;
                      aux=x[i]; x[i]=x[j]; x[j]=aux;
                      aux=y[i]; y[i]=y[j]; y[j]=aux;
             i++; j--;         
         }
     } 
     while (i<=j);
     if (st<j) qSort(st,j);
     if (i<dr) qSort(i,dr);
}

int max(int a, int b)
{
   if (a>b) return a;
   else return b;
}
    
int main()
{
    FILE *f,*g;
    f=fopen("radiatie.in","r");
    g=fopen("radiatie.out","w");
    fscanf(f,"%d %d %d",&n,&m,&K);
    for (int i=0;i<m;i++) fscanf(f,"%d %d %d",&x[i],&y[i],&cost[i]);

    for (int i=1;i<=n;i++) t[i]=0,h[i]=1,ch[i]=0;
    qSort(0,m-1);
    int nr_drumuri=n-1;    
    for (long int k=0;k<m && nr_drumuri>0;k++)
    {
        long int a=x[k];
        while (t[a]>0) a=t[a];
        long int b=y[k];
        while (t[b]>0) b=t[b];
        if (a!=b)
        {
            nr_drumuri--;
            if (h[a]<h[b]) t[a]=b,ch[a]=cost[k];
            else if (h[a]>h[b]) t[b]=a,ch[b]=cost[k];
                 else t[b]=a,h[a]++,ch[b]=cost[k];
        }
        else cost[k]=-1;
    }
    
    for (int kk=0;kk<K;kk++)
    {
        int ax,ay;
        memset(h,0,sizeof(h));
        fscanf(f,"%d %d",&ax,&ay);
        h[ax]=0;
        while (t[ax]>0) h[t[ax]]=max(h[ax],ch[ax]),ax=t[ax];
        int vmax=0;
        while (t[ay]>0 && h[ay]==0) vmax=max(vmax,ch[ay]),ay=t[ay];
        vmax=max(vmax,h[ay]);
        fprintf(g,"%d\n",vmax);
    }    
    fclose(f);
    fclose(g);
    return 0;
}