Cod sursa(job #497168)

Utilizator bog29Antohi Bogdan bog29 Data 1 noiembrie 2010 19:32:18
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<fstream>
#include<vector>
#define dmax 30008
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");

int n,m,q,x,y,f[dmax],h[dmax];
bool t[dmax];

struct mc
{	int v;
	long int ct;
};	

struct muchie
{	int a;
	int b;
	long int c;
}	g[dmax];

vector<struct mc>v[dmax];
vector<struct mc>::iterator it;

int sf(struct muchie p, struct muchie r)
{	return p.c <= r.c;
}

int acc(int x, int y)
{	while( f[x])
		x=f[x];

	while(f[y])
		y=f[y];

	if(x==y)
		return 1;
	return 0;
}

void uneste(int x, int y)
{	while(f[x])
		x=f[x];

	while(f[y])
		y=f[y];
	
	if(h[x] < h[y])
		f[x]=y;
	else if(h[y] < h[x])
		f[y]=x;
	else if(h[x] == h[y])
	{	f[y]=x;
		h[x]++;
	}	
}

void kruskal()
{	int nr,i;
	mc z;

	sort( g+1, g+m+1, sf );	
	nr=0;
	
	for(i=1; nr<n-1; i++)
	{	
		if( !acc(g[i].a, g[i].b) )
		{	nr++;
			uneste(g[i].a, g[i].b);
			z.v=g[i].b;
			z.ct=g[i].c;
			v[g[i].a].push_back(z);
			z.v=g[i].a;
			v[g[i].b].push_back(z);
		}
	}	
}

void dfs(int k,long int mx)
{	vector<struct mc>::iterator it;
	
	if(k==y)
		out<<mx<<'\n';
	else for(it=v[k].begin();it<v[k].end();it++)
		if(!t[it->v])
		{	t[it->v]=1;	
			dfs(it->v,max(mx,it->ct) );
		}	
}


int main()
{	int i,j;
	in>>n>>m>>q;
	
	for(i=1;i<=m;i++)
		in>>g[i].a>>g[i].b>>g[i].c;
	
	for(i=1;i<=n;i++)
		h[i]=1;
	kruskal();
	
	for(i=1;i<=q;i++)
	{	in>>x>>y;
		dfs(x,-1);
		for(j=1;j<=n;j++)
			t[j]=0;
	}
	in.close();
	
	out.close();
	return 0;
}