Cod sursa(job #203102)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 13 august 2008 18:24:45
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<stdio.h>   
#define NM 15001   
#define MM 30001   
#define Max(a, b) ((a) > (b) ? (a) : (b))
int n,m,T,i,j,k;   
int h[NM],t[NM],rus[NM],c[NM];   
int a,b,maxi;
struct rad {
    int x,y,c;
} e[MM],aux;
void Qsort(int st,int dr){   
    int i=st-1;
    int j=dr+1;
    do{
		do{
			++i;
		}while(e[i].c<e[st].c);   
        do{
			--j;
		}while(e[st].c<e[j].c);   
        if(i<=j)
            aux=e[i],e[i]=e[j],e[j]=aux;   
    }while(i<=j);   
    if(i<dr)
		Qsort(i,dr);   
    if(st<j)
		Qsort(st,j);   
}
int search(int nod){   
    if ( t[nod] != nod )
		return search(t[nod]);
	return t[nod];   
}
void cerno(int i,int j){   
    if(h[i]>h[j])
		t[j]=i,c[j]=e[k].c;
	else{
		t[i]=j,c[i]=e[k].c;
		if(h[i]==h[j])
			h[j]++;
	}
}
int fl(int nod){   
    if(rus[nod]!=0)
		return rus[nod];
	if(t[nod]==nod)
		return 1;
	return (rus[nod]=fl(t[nod])+1);
}
void solve(){   
    Qsort(1,m);
	for(i=1;i<=n;++i)
		t[i]=i,h[i]=1,c[i]=0;
	int nrm=n;
	for(k=1;k<=m;++k){   
        if(nrm==1)
			break;
		int r1=search(e[k].x);
		int r2=search(e[k].y);
		if(r1!=r2){
			cerno(r1,r2);
			nrm--;
		}
    }
	for ( i = 1; i <= n; i++ )
		fl(i);
}
int main(){   
    freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);
	scanf("%d %d %d", &n, &m, &T);
	for(i=1;i<=m;++i)
		scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].c);
	solve();
	for(int g=1;g<=T;++g){   
        scanf("%d %d", &a, &b);
        maxi=0;
        while(rus[a]>rus[b])
			maxi = Max(maxi, c[a]), a = t[a];   
        while(rus[b]>rus[a])
			maxi = Max(maxi, c[b]), b = t[b];   
        while(a!=b)
			maxi = Max(maxi, Max(c[a], c[b])), a = t[a], b = t[b];   
        printf("%d\n",maxi);   
    }
	fclose(stdin);
	fclose(stdout);
    return 0;   
}