Cod sursa(job #741000)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 25 aprilie 2012 08:38:50
Problema PScNv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<fstream>
#include<vector>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int n,m,X,Y,kmax,kmin=2000000000,solk=2000000000;
struct Muchie{int nod,d;};
vector <int> G[250100];
Muchie M[500100];
int viz[250100];

inline void Citire()
{
	int i,poz,ns,x,y,d;
	char s[30];
	ifstream fin("pscnv.in");
	//fin>>n>>m>>X>>Y;
	fin.getline(s,30);
	ns=strlen(s);
	poz=0;
	while(s[poz]!=' ')
	{
		n=n*10+s[poz]-'0';
		poz++;
	}
	poz++;
	while(s[poz]!=' ')
	{
		m=m*10+s[poz]-'0';
		poz++;
	}
	poz++;
	while(s[poz]!=' ')
	{
		X=X*10+s[poz]-'0';
		poz++;
	}
	poz++;
	while(poz<ns)
	{
		Y=Y*10+s[poz]-'0';
		poz++;
	}
	//
	for(i=1;i<=n;i++)
	{
		//fin>>M[i].nod1>>M[i].nod2>>M[i].d;
		fin.getline(s,30);
		ns=strlen(s);
		poz=0;
		x=0;
		while(s[poz]!=' ')
		{
			x=x*10+s[poz]-'0';
			poz++;
		}
		poz++;
		y=0;
		while(s[poz]!=' ')
		{
			y=y*10+s[poz]-'0';
			poz++;
		}
		poz++;
		d=0;
		while(poz<ns)
		{
			d=d*10+s[poz]-'0';
			poz++;
		}
		//
		M[i].nod=y;
		M[i].d=d;
		G[x].push_back(i);
		kmax=max(kmax,d);
		kmin=min(kmin,d);
	}
	fin.close();
}

inline bool Ok(int K)
{
	int x,y,d;
	queue <int> Q;
	vector <int>::iterator it;
	viz[X]=K;
	Q.push(X);
	while(!Q.empty())
	{
		x=Q.front();
		Q.pop();
		for(it=G[x].begin();it!=G[x].end();it++)
		{
			y=M[*it].nod;
			d=M[*it].d;
			if(viz[y]!=K && d<=K)
			{
				viz[y]=K;
				Q.push(y);
			}
		}
	}
	if(viz[Y]==K)
		return true;
	return false;
}

inline void CautareBinara()
{
	int st,dr,mij;
	st=kmin;
	dr=kmax;
	while(st<=dr)
	{
		mij=(st+dr)/2;
		if(Ok(mij))
		{
			solk=min(solk,mij);
			dr=mij-1;
		}
		else
			st=mij+1;
	}
}

inline void Afisare()
{
	ofstream fout("pscnv.out");
	fout<<solk<<"\n";
	fout.close();
}

int main()
{
	Citire();
	CautareBinara();
	Afisare();
	return 0;
}