Cod sursa(job #530359)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 7 februarie 2011 17:18:52
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
// citire parsata + sortare muchii + cautare binara + bf //
#include<stdio.h>
#include<vector>
#include<cstring>
#include<algorithm>
#define mp make_pair
using namespace std;
FILE *f=fopen("pscnv.in","r");
FILE *g=fopen("pscnv.out","w");
int N,M,X,Y,ok,m,sol,c[250001];
bool viz[250001];
char cit[32];
vector <pair <int,int> > a[250001];
void bf(){
	int u,p;
	p=1;u=1;c[1]=X,ok=0;
	viz[X]=1;
	memset(viz,0,sizeof(viz));
	while(p<=u){
		int nod=c[p];
		for(unsigned int i=0;i<a[nod].size();i++)
			if( !viz[a[nod][i].first])
				if(a[nod][i].second <=m)
					if( a[nod][i].first == Y)
						{ok=1,p=u;break;}
					else 
						c[++u]=a[nod][i].first;
				else break;
	p++;}
}
inline int cmp(const pair<int,int> &a,const pair<int,int> &b){
	return a.second < b.second;
}
int main(){
	fscanf(f,"%d%d%d%d\n",&N,&M,&X,&Y);
	for(register int i=1;i<=M;++i)
	{  int x,y,z;
	   char *p;
	   fgets(cit,32,f);
	   for (x = 0, p = cit; *p!=' '; p++)
			x = x * 10 + *p - '0';
		for (y = 0, p++; *p!=' '; p++)
			y = y * 10 + *p - '0';
		for (z = 0, p++; p<cit+strlen(cit) && *p!='\n'; p++)
			z = z * 10 + *p - '0';
		if(x!=y)
	   a[x].push_back(mp(y,z));
	}
    int p=1,u=1000;
	for(int i=1;i<=N;++i)
		if(i!=Y)
		sort(a[i].begin(),a[i].end(),cmp);
	while(p<=u){
		m=(p+u)/2;
		bf();
		if(ok) sol=m,u=m-1;
		else p=m+1;		
	}
	fprintf(g,"%d",sol);
return 0;
}