Cod sursa(job #45135)

Utilizator mastermageSchneider Stefan mastermage Data 1 aprilie 2007 01:20:31
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;

#define maxN 15100
#define maxM 30100
#define maxLgN 20

struct edge{int a,b,c;edge(){}edge(int const&ap,int const&bp,int const&cp){a=ap,b=bp,c=cp;}bool operator<(edge const&r)const{return c<r.c;}};
struct nod{int v,c;nod*n;nod(){}nod(int const&vp,int const&cp,nod*const&np){v=vp,c=cp,n=np;}};
struct query{int x,y;query(){}query(int const&xp,int const&yp){x=xp,y=yp;}};

void del(nod*&p,int x){nod*q=p,*r;if(p->v==x){p=p->n;delete q;}else{while(q->n->v!=x)q=q->n;r=q->n;q->n=r->n;delete r;}}

int n,m,k, bal[maxN],cbal[maxN],root[maxN],fat[maxN],fatl[maxN],niv[maxN],g;
query qu[maxN];edge muc[maxM];
nod*d[maxN];
int dm[maxN][maxLgN], mm[maxN][maxLgN];

void inputFunc(){
	FILE*fi=fopen("radiatie.in","r");
	fscanf(fi,"%d %d %d",&n,&m,&k);
	for(int i=0;i<m;i++){
		int a,b,c;fscanf(fi,"%d %d %d",&a,&b,&c);muc[i]=edge(a-1,b-1,c);
	}
	for(int i=0;i<k;i++){
		int x,y;fscanf(fi,"%d %d",&x,&y);qu[i]=query(x-1,y-1);
	}
	sort(muc,muc+m);
	for(int i=0;i<n;i++)bal[i]=i,cbal[i]=-1;
	for(int i=0,j=1;j<n && i<m;i++){int a=muc[i].a,b=muc[i].b,c=muc[i].c;if(bal[a]!=bal[b]){
		d[a]=new nod(b,c,d[a]);
		d[b]=new nod(a,c,d[b]);
		int fro,to;if(bal[a]<bal[b])fro=bal[b],to=bal[a];else fro=bal[a],to=bal[b];
		for(int h=0;h<n;h++)if(bal[h]==fro)bal[h]=to;
		j++;
	}}
	
	
	for(int i=0;i<n;i++){
		if(cbal[bal[i]]>=0)bal[i]=cbal[bal[i]];else cbal[bal[i]]=g,bal[i]=g,root[g]=i, g++;
	}
	
	
	for(int i=0;i<g;i++){
		queue<int> q;q.push(root[i]);fat[root[i]]=-1;
		while(!q.empty()){
			int c=q.front(),cn=niv[c],mmax=fatl[c],who=fat[c];q.pop();
			dm[c][0]=mmax;mm[c][0]=who;
			for(int b=1,u=2;u<=cn;b++,u<<=1){
				mmax=max(mmax,dm[who][b-1]);
				who=mm[who][b-1];
				
				dm[c][b]=mmax;mm[c][b]=who;
			}
			
			for(nod*j=d[c];j;j=j->n){
				int p=j->v;
				del(d[p],c);niv[p]=niv[c]+1;fat[p]=c;fatl[p]=j->c;q.push(p);
			}
		}
	}
	
	
	fclose(fi);
}

int main(){
	inputFunc();
	FILE*fo=fopen("radiatie.out","w");
	
	for(int i=0;i<k;i++){
		int a=qu[i].x,b=qu[i].y;
		if(niv[a]<niv[b])swap(a,b);
		
		int ma=0,mb=0,dif=niv[a]-niv[b],y=0,z,na,nb;
		while(dif){
			if(dif&1)ma=max(ma,dm[a][y]),a=mm[a][y];
			dif>>=1,y++;
		}
		
		y=0,z=1,dif=niv[a];
		while(a!=b){
			if(z>dif)y=0,z=1;
			na=mm[a][y],nb=mm[b][y];
			if(na==nb)y=0,z=1;
			ma=max(ma,dm[a][y]),a=mm[a][y];
			mb=max(mb,dm[b][y]),b=mm[b][y];
			dif-=z;y++;z<<=1;
		}
		
		
		fprintf(fo,"%d\n",max(ma,mb));
	}

	fclose(fo);return 0;
}