Cod sursa(job #8116)

Utilizator SzakatsSzakats Istvan Szakats Data 23 ianuarie 2007 20:32:10
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
//#include <conio.h>
#include <search.h>

/**/

#define max_n 15000
#define max_m 30000
#define max_k 15000

/*

#define max_n 1000
#define max_m 1000
#define max_k 1000

/**/

#define min(a,b) a < b ? a : b
#define max(a,b) a > b ? a : b

void readln()
{
//	getch();
}

void clear()
{
//	clrscr();
}

struct node
{
	node * next;
	int d; // destination
	unsigned long l; // length
	node(int dest, int len, node * next = NULL) : d(dest), l(len), next(next) {}
	void setnext(node * nod) { next = nod; }
} *a[max_n+1];

int b[max_k+1][3];

unsigned long q[max_n+2], nq;
int v[max_n+1];
unsigned long rez[max_k+1];

int sort_function( const void *a, const void *b)
{
	return *(int*)a - *(int*)b;
}

int main()
{
	clear();
	FILE *fin = fopen("radiatie.in", "r");
	freopen("radiatie.out", "w",stdout);

	int n,m,k;
	int i,j,l;

	fscanf(fin, "%d %d %d", &n, &m, &k);

	for (i = 0; i < m; i++)
	{
		int x,y,z;
		fscanf(fin, "%d %d %d", &x, &y, &z);
		a[x-1] = new node(y-1,z,a[x-1]);
		a[y-1] = new node(x-1,z,a[y-1]);
	}

	for (i = 0; i < k; i++)
	{
		int x,y;
		fscanf(fin, "%d %d", &x, &y);
		b[i][0] = x-1;
		b[i][1] = y-1;
		b[i][2] = i;
	}

	qsort((void*)b, k, sizeof(b[0]), sort_function);

	int cur = -1;
	q[n] = 16000;

	for (i = 0; i < k; i++)
	{
		if (b[i][0] != cur)
		{
			cur = b[i][0];
			for (j = 0; j < n; j++)
			{
				q[j] = 16000;
				v[j] = 0;
			}
			nq = 0;
			v[cur] = 1;
			for (node *nod = a[cur]; nod != NULL; nod = nod->next)
			{
				q[nod->d] = nod->l;
				nq++;
			}

			while(nq != 0)
			{
				int next = cur;
				for (j = 0; j < n; j++)
					if (!v[j] && q[j] < q[next]) next = j;

				for (node *nod = a[next]; nod != NULL; nod = nod->next)
				{
					if (nod->d == cur) continue;
					int d = max(q[next], nod->l);
					if (q[nod->d] == 16000)	{ q[nod->d] = d; nq++; }
					else if (d < q[nod->d]) q[nod->d] = d;
				}

				nq--;
				v[next] = 1;
			}
		}

		rez[b[i][2]] = q[b[i][1]];
	}

	for (i = 0; i < k; i++)
		printf("%d\n", rez[i]);

	readln();
	return 0;
}