Cod sursa(job #1050537)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 8 decembrie 2013 17:53:43
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>
#define Cmax 1005
#define Nmax 250005
#define Lg 3000000
#define verf ++poz==Lg? fin.read(Buffer,Lg), poz=0:0

using namespace std;
ifstream fin("pscnv.in");

int N,X,Y,t[Nmax],poz;
char Buffer[Lg];

struct Pereche
{
    int x,y;
};
vector <Pereche> L[Cmax];

inline void Citeste(int &x)
{
    for(; Buffer[poz]<'0' || Buffer[poz]>'9'; verf);
    for(x=0; Buffer[poz]>='0' && Buffer[poz]<='9'; x=x*10+Buffer[poz]-'0', verf);
}

inline void Read()
{
    int M,i,cost;
    Pereche w;
    Citeste(N); Citeste(M); Citeste(X); Citeste(Y);
    for(i=1;i<=M;++i)
    {
        Citeste(w.x); Citeste(w.y); Citeste(cost);
        L[cost].push_back(w);
    }
    fin.close();
}

inline int Find(int a)
{
    int i=a,rad;
    while(t[a]>=0)
        a=t[a];
    rad=a;
    while(t[i]>=0)
    {
        a=t[i];
        t[i]=rad;
        i=a;
    }
    return rad;
}

inline void Union(int a,int b)
{
    t[a]+=t[b]; t[b]=a;
}

inline int Solve()
{
    int i,n1,n2,a,b,len,cost;
    for(i=1;i<=N;++i)
        t[i]=-1;
    for(cost=1;cost<=1000;++cost)
    {
        len=L[cost].size();
        for(i=0;i<len;++i)
        {
            n1=L[cost][i].x; n2=L[cost][i].y;
            a=Find(n1); b=Find(n2);
            if(a!=b)
                Union(a,b);
        }
        if(Find(X)==Find(Y))
            return cost;
    }
}

int main()
{
    Read();
    ofstream fout("pscnv.out");
    fout<<Solve()<<"\n";
    fout.close();
}