Cod sursa(job #388031)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 29 ianuarie 2010 10:18:09
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<cstdio>
#define N 151
#include<algorithm>
#include<bitset>
#include<vector>
#define maxim(a,b) ((a>b)? (a):(b))
#define pb push_back
using namespace std;
int z[N],x[N],y[N],gr[N],rang[N],n,m,t,ind[N],c[N][N],rez;
int x1,y1;
bitset<N> viz;
bool ok;
vector<int> a[N];
bool cmp(const int &i,const int &j)
{
	return z[i]<z[j];
}
void unesc(int x,int y)
{
	if (rang[x]<rang[y])
		gr[x]=y;
	else
	{
		gr[y]=x;
		rang[x]+=(rang[x]==rang[y]);
	}
}
int find(int x)
{
	if (gr[x]!=x)
		gr[x]=find(gr[x]);
	return gr[x];
}
void apm()
{
	for (int i=1; i<=n; ++i)
	{
		gr[i]=i;
		rang[i]=1;
	}
	int num=0;
	for (int i=1; i<=m&&num<n-1; ++i)
	{
		int u=find(x[ind[i]]),v=find(y[ind[i]]);
		if (u!=v)
		{
			unesc(u,v);
			++num;
			a[x[ind[i]]].pb(y[ind[i]]);
			a[y[ind[i]]].pb(x[ind[i]]);
			c[x[ind[i]]][y[ind[i]]]=z[ind[i]];
			c[y[ind[i]]][x[ind[i]]]=z[ind[i]];
		}
	}
}
void df(int n,int maxx)
{
	viz[n]=1;
	size_t g=a[n].size();
	if (n==y1)
	{
		ok=true;
		rez=maxx;
		return;
	}
	if (ok)
		return;
	for (size_t i=0; i<g; ++i)
	{
		if (viz[a[n][i]])
			continue;
		df(a[n][i],maxim(maxx,c[n][a[n][i]]));
		if (ok)
			return;
	}
}
void citire()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	scanf("%d%d%d",&n,&m,&t);
	for (int i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&x[i],&y[i],&z[i]);
		ind[i]=i;
	}
	sort(ind+1,ind+1+m,cmp);
	apm();
	while (t--)
	{
		scanf("%d%d",&x1,&y1);
		df(x1,0);
		viz.reset();
		ok=false;
		printf("%d\n",rez);
	}
}
int main()
{
	citire();
	return 0;
}