Cod sursa(job #50359)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 7 aprilie 2007 16:16:09
Problema PScNv Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstdlib>
#define NMAX 200200
#define CMAX 200200
#define MAX(a, b) ((a) > (b) ? (a):(b))

using namespace std;

vector<int> A[NMAX];
vector<int> K[NMAX];
int N, M, X, Y, Kmin, F[NMAX], C[CMAX+10], G[NMAX];
char buf[NMAX*50];

int main()
{
        int i, j, c, k, hi, lo, mij, m = 0, p1, p2, ok, nod, t, x;

        FILE *f = fopen("pscnv.in", "rt");
        setbuffer(f,buf,sizeof(buf));
        fscanf(f,"%d %d %d %d", &N, &M, &X, &Y);

        while (M--)
        {
                fscanf(f,"%d %d %d", &i, &j, &c);
                if (i != j)
                {
                   G[i]++; G[j]++;
                   A[i].push_back(j);
                   A[j].push_back(i);
                   K[i].push_back(c);
                   K[j].push_back(c);
                   m = MAX(m, c);
                }
        }

        if (N > 200000) x = 69;
        else x = N;

        Kmin = m;
        for (lo = 0, hi = m; lo <= hi;)
        {
                mij = (hi+lo)>>1;
                C[p1 = 0] = X; p2 = 1;
                for (i = 0; i <= N; i++, F[i] = 0);
                for (ok = 0, F[X] = 1; p1 != p2 && ok == 0 && p2 < x; )
                {
                        for (nod = C[p1], m = G[nod], i = 0; i < m && ok == 0; i++)
                            if (F[ t = A[nod][i] ] == 0 && K[nod][i] <= mij)
                            {
                                F[ t ] = 1; C[p2] = t;
                                ok = (t == Y); p2++;
                            }
                        p1++;
                }
                ((ok == 1) ? ({ hi = mij-1, Kmin = mij; }):({ lo = mij+1; }));
        }

        freopen("pscnv.out", "w", stdout);
        printf("%d\n", Kmin);

        return 0;
        
}