Cod sursa(job #1048622)

Utilizator varga13VarGaz13 varga13 Data 6 decembrie 2013 09:38:12
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <deque>
#include <vector>
#include <iterator>
#define mn 100006 //max n
using namespace std;

ifstream f("sate.in");
ofstream g("sate.out");

struct drum{
int nod;
int dist;
drum(int Nod, int Dist)
{
   nod=Nod;
   dist=Dist;
}
};

vector<drum> adiacent[mn];
int Sol[mn], Coada[mn], LG[mn];
int m,n,Start,End;

void Read()
{int a1,a2,a3;
    f>>n>>m>>Start>>End;
    for(int i=0;i<m;++i)
        {
            f>>a1>>a2>>a3;
            adiacent[a1].push_back(drum(a2,a3));
            adiacent[a2].push_back(drum(a1,-a3));
        }

}

void Print()
{
   for(int i=1;i<=n;++i)
        g<<Sol[i]<<' ';
}

void CreateLG()
{
    for(int i=1;i<=n;i++)
        LG[i]=adiacent[i].size();
}

void BFS()
{
    for(int i=1;i<=n;i++)
        Sol[i]=0;

    Coada[1]=Start;
    int L=1;
    for(int i=1;i<=L && Coada[L]!=End;++i )
        for(int j=0;j<LG[Coada[i]]; ++j)
            if(Sol[adiacent[Coada[i]][j].nod]==0)
            {
                Coada[++L]=adiacent[Coada[i]][j].nod;//elementul actual se adauga in varful cozii
                Sol[Coada[L]]=Sol[Coada[i]]+adiacent[Coada[i]][j].dist;//solutia pentru elementul actual
            }
    g<<Sol[End]<<'\n';
}

int main()
{
    Read();
    CreateLG();
    BFS();
    //Print();

    f.close();
    g.close();
    return 0;
}