Cod sursa(job #1197585)

Utilizator apopeid15Apopei Daniel apopeid15 Data 12 iunie 2014 20:17:55
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define PII pair<int, int>
#define x first
#define y second
#define mp make_pair
 
using namespace std;
 
const int N=250005, M=1001, INF=0x3f3f3f3f;
 
vector <PII> G[N];
vector <int> C[M];
int dist[N];
int n, start, finish;
 
void Solve()
{
    int i, x;
    memset(dist, INF, sizeof(dist));
    dist[start]=0;
    C[0].push_back(start);
    for(i=0;i<M;i++)
    {
        for(size_t j=0;j<C[i].size();j++)
        {
            x=C[i][j];
            if(dist[x]!=i) continue;
            if(x==finish)
            {
                printf("%d\n", dist[x]);
                return;
            }
            for(auto p: G[x])
            {
                if(max(i, p.y)<dist[p.x])
                {
                    dist[p.x]=max(i, p.y);
                    C[max(i, p.y)].push_back(p.x);
                }
            }
        }
        C[i].clear();
    }
}
 
int main()
{
    freopen("pscnv.in", "r", stdin);
    freopen("pscnv.out", "w", stdout);
    int m, x, y, z;
    char cit[30], *p;
    scanf("%d %d %d %d\n", &n, &m, &start, &finish);
    while(m--)
    {
        x=y=z=0;
        fgets(cit, 30, stdin);
        for(p=cit;*p>='0'&&*p<='9';p++) x=10*x+*p-'0'; p++;
        for(;*p>='0'&&*p<='9';p++) y=10*y+*p-'0'; p++;
        for(;*p>='0'&&*p<='9';p++) z=10*z+*p-'0';
        G[x].push_back(mp(y, z));
    }
    Solve();
}