Cod sursa(job #673477)

Utilizator federerUAIC-Padurariu-Cristian federer Data 4 februarie 2012 15:38:50
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include<fstream>
#include<set>
#include<vector>
#define Nmax 15001
#define INF 1000000000
#define pb push_back
using namespace std;
struct drum{int x, y;};
drum drumuri[Nmax];
vector< pair<int, int> > G[Nmax], A[Nmax];
set < pair<int, int> > cmin;
int d[Nmax], p[Nmax], i, viz[Nmax],n, m, k, solmax, Max;
int start, stop;
void read()
{
	int a, b, c;
	freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);
	scanf("%d%d%d", &n , &m, &k);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d", &a, &b, &c);
		G[a].pb(make_pair(b, c));
		G[b].pb(make_pair(a, c));
	}
	for(i=1;i<=k;i++)
	{
		scanf("%d%d", &a, &b);
		drumuri[i].x=a;
		drumuri[i].y=b;
	}
}

void init()
{
	for(i=0;i<G[1].size();i++)
	{
		cmin.insert(make_pair(G[1][i].second, G[1][i].first));
		d[G[1][i].first]=G[1][i].second;
		p[G[1][i].first]=1;
	}
	for(i=1;i<=n;i++)
		if(!d[i])
			d[i]=INF;
	viz[1]=1;
}
void APM()
{
	int nrv=n-1, costmin, vfmin;
	set< pair<int, int> >::iterator it;
	while(nrv)
	{
		it=cmin.begin();
		costmin=(*it).first;
		vfmin=(*it).second;
		viz[vfmin]=1;
		nrv--;
		cmin.erase(make_pair(costmin, vfmin));
		for(i=0;i<G[vfmin].size();i++)
			if(!viz[G[vfmin][i].first] && G[vfmin][i].second<d[G[vfmin][i].first])
			{
				cmin.erase(make_pair(d[G[vfmin][i].first], G[vfmin][i].first));
				cmin.insert(make_pair(G[vfmin][i].second, G[vfmin][i].first));
				d[G[vfmin][i].first]=G[vfmin][i].second;
				p[G[vfmin][i].first]=vfmin;
			}
	}
}
void creatAPM()
{
	for(i=2;i<=n;i++)
	{
		A[p[i]].pb(make_pair(i, d[i]));
		A[i].pb(make_pair(p[i], d[i]));
	}
}

int DFS(int k, int M)
{
	int i, ca, t=0, Max;

	for(i=0;i<A[k].size();i++)
	{
		if(!viz[A[k][i].first])
		{
			if(M<A[k][i].second)
			{
				Max=M;
				M=A[k][i].second;
				t=1;
			}
			viz[A[k][i].first]=1;
			if(A[k][i].first==stop)
			{
				solmax=M;
				return 0;
			}
			ca=A[k][i].first;
			DFS(ca, M);
			M=Max;
			viz[A[k][i].first]=0;
		}
	}
}

void solve()
{
	for(i=1;i<=n;i++)
		viz[i]=0;
	for(i=1;i<=k;i++)
	{
		start=drumuri[i].x;
		stop=drumuri[i].y;
		viz[start]=1;
		DFS(start, 0);
		viz[start]=viz[stop]=0;
		printf("%d\n", solmax);
	}
}	
int main()
{
	read();
	init();
	APM();
	creatAPM();
	solve();
	fclose(stdin);
	fclose(stdout);
	return 0;
}