Pagini recente » Cod sursa (job #2878038) | Cod sursa (job #1348609) | Cod sursa (job #1614875) | Cod sursa (job #204318) | Cod sursa (job #1048620)
#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;
}