Cod sursa(job #1458086)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 6 iulie 2015 16:54:49
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#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;
			}
        }
	}
}