Cod sursa(job #669750)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 27 ianuarie 2012 18:07:55
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

#define pi pair<int,short int>
#define x first
#define y second
#define mp make_pair
#define INF 10000
#define NMAX 250005
#define maxim(a,b) (a>b ? a : b)
#define pb push_back

vector<int> q[1005];
vector< pi > v[NMAX];
int n,m,start,sfarsit,poz;
short int sol[NMAX];
char s[52];

inline int afla()
{
    	int val=0;
    	while(s[poz]>='0' && s[poz]<='9')
    	{
       		val=(val<<3)+(val<<1)+s[poz]-'0';
        	poz++;
    	}
    	poz++;
    	return val;
}

int main ()
{
    	int i,j,t,a,b,c;
    	int lim,lim2,vec,vec2;
    
    	freopen("pscnv.in","r",stdin);
    	freopen("pscnv.out","w",stdout);

    	scanf("%d%d%d%d\n",&n,&m,&start,&sfarsit);
    	for(i=1;i<=m;i++)
    	{
       		fgets(s,sizeof(s),stdin);
        	poz=0;
        	a=afla();
        	b=afla();
        	c=afla();
        	v[a].pb(mp(b,c));
    	}
    	for(i=1;i<=n;i++)
        	sol[i]=INF;
    	q[0].pb(start);
    	sol[start]=0;
    	for(i=0,lim=1;i<=1000;i++,lim=q[i].size())
	{
		if(sol[sfarsit]==i)
		{
			printf("%d\n",i);
			return 0;
		}
        	for(j=0;j<lim;j++)
       		{
            		vec=q[i][j];
            		if(sol[vec]!=i)
                		continue;
            		lim2=v[vec].size();
            		for(t=0;t<lim2;t++)
            		{
                		vec2=v[vec][t].x;c=maxim(i,v[vec][t].y);
               			if(sol[vec2]>c)
                		{
                    			sol[vec2]=c;
                    			q[c].pb(vec2);
                    			if(c==i)
					{
						lim++;
						if(vec2==sfarsit)
						{
							printf("%d\n",i);	
							return 0;
						}
					}
                		}
            		}
        	}
	}
    return 0;
}