Cod sursa(job #6998)

Utilizator crusRus Cristian crus Data 21 ianuarie 2007 11:35:19
Problema Radiatie Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.32 kb
#include <stdio.h>
#include <string.h>
#define input "radiatie.in"
#define output "radiatie.out"
#define nmax 16002
#define infinit 1000000009
struct nod{int n,c; nod *urm;};
nod *c[nmax],*q,*prim;
long n,m,k,i,n1,n2,cost,cnt,mij,s,d,ls,ld;
int v[nmax];
long sol;
short fol[nmax];
inline long max(long a, long b)
{
	return a>b?a:b;
}
void bfs(int nod)
{
	int nn=1;
	int nc=1;	
	while (nc<=nn)
		{
		q=c[v[nc]];
		while (q)
				{
				if (q->c<=mij&&fol[q->n]==0)
					{
					  nn++;
					  v[nn]=q->n;
					  fol[v[nn]]=1;
					}
				q=q->urm;
				}
        nc++;
		}
}
int main()
{
	FILE *fin,*fout;
	fin=fopen(input,"r");
	fout=fopen(output,"w");
	fscanf(fin,"%ld %ld %ld",&n,&m,&k);
	for (i=1;i<=n;i++) c[i]=NULL;
	for (i=1;i<=m;i++)
		{
		fscanf(fin,"%ld %ld %ld",&n1,&n2,&cost);
		q=new nod;
		q->c=cost;
		q->n=n2;
		q->urm=c[n1];
		c[n1]=q;
		q=new nod;
		q->c=cost;
		q->n=n1;
		q->urm=c[n2];
		c[n2]=q;
		}
	for (i=1;i<=k;i++)
		{
		fscanf(fin,"%ld %ld",&s,&d);	

		sol=0;
		ls=0;
		ld=infinit;
		while (ls<=ld)
			{
			 mij=(ls+ld)/2;
			 memset(fol,0,sizeof(fol));
			 v[1]=s;
			 fol[s]=1;
			 bfs(s);
			 if (fol[d])
				{
				 sol=mij;
				 ld=mij-1;
				}	
			     else ls=mij+1;
			}
		fprintf(fout,"%ld\n",sol);
		}
	fclose(fin);
	fclose(fout);
	return 0;
}