Cod sursa(job #2152628)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 5 martie 2018 18:16:01
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <cstdio>
#include <queue>
#include <vector>
#define N 30005
#define inf 300000000
using namespace std;

struct elem{
            int node, cost;
           };

vector <elem> G[N];
int n, st, fin, dist[N];

void Read()
{
    int m, x, y, d;
    elem e;

    freopen("sate.in", "r", stdin);
    scanf("%d%d%d%d", &n, &m, &st, &fin);

    while (m--)
    {
        scanf("%d%d%d", &x, &y, &d);
        e.cost = d;

        e.node = y;
        G[x].push_back(e);

        e.node = x;
        G[y].push_back(e);
    }
}

void Bfs()
{
    queue <int> q;
    int node,i;
    elem vec;

    for (i=1;i<=n;++i) dist[i]=inf;
    q.push(st);dist[st]=0;

    while (!q.empty())
    {
        node=q.front();q.pop();

        for (i=0; i<G[node].size(); ++i)
        {
            vec = G[node][i];
            if (dist[vec.node] == inf)
            {
                if (node < st)
                {
                    if (vec.node < node)
                        dist[vec.node] = dist[node] + vec.cost;
                    if (node < vec.node && vec.node < st)
                        dist[vec.node] = dist[node] - vec.cost;
                    if (vec.node > st)
                        dist[vec.node] = vec.cost - dist[node];
                }
                else
                {
                    if (vec.node > node)
                        dist[vec.node] = dist[node] + vec.cost;
                    if (st < vec.node && vec.node < node)
                        dist[vec.node] = dist[node] - vec.cost;
                    if (vec.node < st)
                        dist[vec.node] = vec.cost - dist[node];
                }

                q.push(vec.node);
            }
        }
    }
}

void Write()
{
    freopen("sate.out", "w", stdout);

    printf("%d", dist[fin]);
}

int main()
{
    Read();
    Bfs();
    Write();
    return 0;
}