Cod sursa(job #8080)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 23 ianuarie 2007 19:54:57
Problema Radiatie Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include<stdio.h>
#define fin  "radiatie.in"
#define fout "radiatie.out"
#define Nmax 50001
#define Mmax 100001
#define Inf 100000000000LL
int n,m,k,adr[Nmax],v[Mmax][3],ask[Nmax][4],viz[Nmax];
long long cost[Nmax];
int st[Nmax];
FILE *in,*out;

void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }

long long max(long long a,long long b) {
	if (a>b) return a;
	return b;
}

void qsort1(int st,int dr){
int i,j,m;
	i=st; j=dr;
	m=v[(i+j)/2][0];
	do {
		while (v[i][0]<m) ++i;
		while (v[j][0]>m) --j;
		if (i<=j) {
			swap(v[i][0],v[j][0]);
			swap(v[j][1],v[i][1]);
			swap(v[i][2],v[j][2]);
			++i; --j;
		}
	
	} while (i<j);

	if (i<dr) qsort1(i,dr);
	if (j>st) qsort1(st,j);
}

void qsort2(int st,int dr,int p){
int i,j,m;
	i=st; j=dr;
	m=ask[(i+j)/2][p];
	do {
		while (ask[i][p]<m) ++i;
		while (ask[j][p]>m) --j;
		if (i<=j) {
			swap(ask[i][0],ask[j][0]);
			swap(ask[j][1],ask[i][1]);
			swap(ask[i][2],ask[j][2]);
			swap(ask[i][3],ask[j][3]);
			++i; --j;
		}
	
	} while (i<j);

	if (i<dr) qsort2(i,dr,p);
	if (j>st) qsort2(st,j,p);
}

void run() {
int i,nod,poz;
long long min,cost1;
	min=Inf;
	for (i=1;i<=st[0];++i) 
		if (cost[st[i]]<min) {

			min=cost[st[i]];
			nod=st[i];
			poz=i;
		}
	
	if (min==Inf) return;

	viz[nod]=1;
	st[poz]=st[st[0]];
	st[0]--;

	for (i=adr[nod];v[i][0]==nod;++i) 
		
		if (!viz[v[i][1]]) {
			
			cost1=max(cost[nod],v[i][2]);

			if (!cost[v[i][1]]) { 
				cost[v[i][1]]=cost1;
				st[++st[0]]=v[i][1];
			}

			else 
				if (cost[v[i][1]]>cost1) 
					cost[v[i][1]]=cost1;
		}

	if (st[0]) run();

}

int main() {
int i,j;
	in=fopen(fin,"r"); out=fopen(fout,"w");
	fscanf(in,"%i%i%i",&n,&m,&k);

	for (i=1;i<=m;++i) {
		fscanf(in,"%i%i%i",&v[i][0],&v[i][1],&v[i][2]);
		v[m+i][0]=v[i][0];
		v[m+i][1]=v[i][1];
		v[m+i][2]=v[i][2];
		swap(v[m+i][0],v[m+i][1]);
	}

	m*=2;
	qsort1(1,m);

	for (i=1;i<=m;) {
		j=i;
		adr[v[i][0]]=i;
		while (v[j][0]==v[i][0] && j<=m) ++j; 		
		i=j;
	}

	for (i=1;i<=k;++i) {
		fscanf(in,"%i%i",&ask[i][0],&ask[i][1]);
		ask[i][2]=i;
		if (ask[i][0]>ask[i][1]) swap(ask[i][0],ask[i][1]);	
	}

	qsort2(1,k,0);

	//for (i=1;i<=n;++i) printf("%i ",adr[i]);

	for (i=1;i<=k;) {
		for (j=1;j<=n;++j) { cost[j]=0; viz[j]=0; }
		st[0]=1; st[1]=ask[i][0];
		viz[ask[i][0]]=1;
		run(); 
		j=i;
		while (ask[j][0]==ask[i][0] && j<=k) {
			ask[j][3]=cost[ask[j][1]];
			++j;
		}
		i=j;
	}
	
	qsort2(1,k,2);

	for (i=1;i<=k;++i) fprintf(out,"%i\n",ask[i][3]);
	
	//for (i=1;i<=m;++i) printf("\n%i %i",v[i][0],v[i][1]);

	//printf("\n");
	//for (i=1;i<=k;++i) printf("\n%i %i",ask[i][0],ask[i][1]);
	
	fclose(in); fclose(out);

	return 0;
}