Pagini recente » Istoria paginii runda/abcdefghijklmnop/clasament | Istoria paginii runda/pc_11a/clasament | Istoria paginii runda/simulareoni/clasament | Istoria paginii runda/21/clasament | Cod sursa (job #1458086)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
vector<bool> v;
int n, m, X,Y;
queue<int> Q;
vector<vector<pair<int, int>>> G;
vector<int> d;
void Read();
void Bfs(int x);
int main()
{
Read();
Bfs(X);
fout << d[Y];
fin.close();
fout.close();
}
void Read()
{
fin >> n >> m >> X >> Y;
d = vector<int>(n + 1);
v = vector<bool>(n + 1);
G = vector<vector<pair<int, int>>>(n + 1, vector<pair<int, int>>());
int x, y, z;
for ( int i = 1; i <= m; ++i)
{
fin >> x >> y >> z;
G[x].push_back({y, z});
G[y].push_back({x, z});
}
}
void Bfs(int x)
{
Q.push(x);
v[x] = 1;
int y, dis;
while ( !Q.empty() )
{
x = Q.front();
Q.pop();
for (auto z : G[x] )
{
y = z.first;
dis = z.second;
if ( !v[y] )
{
Q.push(y);
v[y] = true;
if ( x < X )
{
if ( y < X )
{
if ( x < y )
d[y] = d[x] - dis;
else
d[y] = d[x] + dis;
}
else
d[y] = dis - d[x];
}
if ( x > X )
{
if ( y > X )
{
if ( x < y )
d[y] = d[x] + dis;
else
d[y] = d[x] - dis;
}
else
d[y] = dis - d[x];
}
if ( x == X )
d[y] = dis;
if ( y == Y )
return;
}
}
}
}