Cod sursa(job #315341)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 15 mai 2009 06:25:46
Problema Radiatie Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include<stdio.h>
#include<stdlib.h>
#define NM 15001
#define MM 30001
struct edge{
	int x,y,c;
	};
typedef edge*pe;
struct nod{
	int vecin,c;
	nod*adr;
	};
typedef nod*pnod;
struct lista{
	pnod vf,sf;
	};
struct nnod{
	int info;
	nnod*adr;
	};
typedef nnod*pnn;
struct llista{
	int nr;
	pnn vf,sf;
	};
struct qry{int x,y,id,r;};
typedef qry*pq;
qry q[NM];
llista ll[NM];
lista l[NM];
edge v[MM],h[NM];
int n,m,k,cc[NM],c[NM],li,ls,d[NM];

int fcmp(void const*a,void const*b){
return ((pe)a)->c-((pe)b)->c;
}

void apm(){
int i=0,k=0,min,max,ms=0,st,dr;
pnn nc;
while(ms<n-1){
	while(cc[v[i].x]==cc[v[i].y]) i++;
	ms++;h[k++]=v[i];
	if(ll[cc[v[i].x]].nr>ll[cc[v[i].y]].nr){
		max=ll[cc[v[i].x]].nr,min=ll[cc[v[i].y]].nr;
		dr=cc[v[i].x],st=cc[v[i].y];
		}
	else {
		max=ll[cc[v[i].y]].nr,min=ll[cc[v[i].x]].nr;
		st=cc[v[i].x],dr=cc[v[i].y];
		};
	/*for(j=1;j<=n;++j)
		if(cc[j]==max) cc[j]=min;*/
	nc=ll[st].vf;
	while(nc){
		cc[nc->info]=dr;
		nc=nc->adr;
		}
	ll[dr].sf->adr=ll[st].vf;
	ll[dr].sf=ll[st].sf;
	ll[st].vf=NULL,ll[st].nr=0;
	ll[dr].nr+=min;
	}
}

void addend(lista &ll,int x,int c){
pnod nn=new nod;
nn->vecin=x;
nn->c=c;
nn->adr=NULL;
if(!(ll.vf)) ll.vf=nn;
else ll.sf->adr=nn;
ll.sf=nn;
}
void pune(int x){c[++ls]=x;}
void scoate(int &x){x=c[li++];}


void dfs(int a){
int i,j;
li=1,ls=0;
int viz[NM]={0};
for(i=1;i<=n;++i) d[i]=0;
pnod nc;
pune(a);
while(li<=ls){
	scoate(i);
	nc=l[i].vf;
	while(nc){
		j=nc->vecin;

		if(!viz[j]) {
			pune(j);
			viz[j]=1;
			if(d[i]<nc->c) d[j]=nc->c;
			else d[j]=d[i];
			}
		nc=nc->adr;
		}
	}
d[a]=-1;
return ;
}
int fcmp2(void const*a,void const*b){
return ((pq)a)->x-((pq)b)->x;
}
int fcmp3(void const*a,void const*b){
return ((pq)a)->id-((pq)b)->id;
}

int main(){
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
int i,j,x,y,aux;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<m;++i)
	scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].c);
qsort(v,m,sizeof(v[0]),fcmp);
pnn nn;
for(i=1;i<=n;++i){
	cc[i]=i;
	nn=new nnod;
	nn->info=i;
	nn->adr=NULL;
	ll[i].nr=1;
	ll[i].vf=ll[i].sf=nn;
	}
apm();
for(i=0;i<n-1;++i) {
	addend(l[h[i].x],h[i].y,h[i].c);
	addend(l[h[i].y],h[i].x,h[i].c);
	}
for(j=0;j<k;++j){scanf("%d%d",&x,&y);
	if(x>y) aux=x,x=y,y=aux;
	q[j].x=x,q[j].y=y,q[j].id=j;
	}
qsort(q,k,sizeof(q[0]),fcmp2);
for(j=0;j<k;++j){
	if(d[q[j].x]!=-1) dfs(q[j].x);
	q[j].r=d[q[j].y];
	}
qsort(q,k,sizeof(q[0]),fcmp3);
for(j=0;j<k;++j)
	printf("%d\n",q[j].r);

return 0;
}