Cod sursa(job #2455442)

Utilizator victorv88Veltan Victor victorv88 Data 11 septembrie 2019 19:21:32
Problema Sate Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;



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

vector<pair<long long,long long> >graph[30005];
queue<long long>q;

long long n, x, from, to, a, b, c, m;
long long distante[30005];

void citire()
{
    f >> n >> m >> from >> to;
    for (long long i=1; i<=m; ++i)
    {
        f >> a >> b >> c;
        graph[a].push_back({b,c});
        graph[b].push_back({a,c});
    }
    for (long long i=1; i<=n; ++i)
        distante[i]=99999999;
}

long long modul(long long x, long long y)
{
    if (x>y)
        return x-y;
    return y-x;
}

void rezolvare()
{
    distante[from]=0;
    q.push(from);
    while(!q.empty())
    {
        long long sus=q.front();
        q.pop();
        for (auto &v:graph[sus])
        {
            long long dest=v.first;
            long long cost=v.second;
            if (sus==from)
            {
                if (distante[dest]>cost)
                    distante[dest]=cost, q.push(dest);
            }
            else if (dest > from && sus > from)
            {
                if (dest>sus)
                {
                    if (distante[dest]>distante[sus]+cost)
                    {
                        distante[dest]=distante[sus]+cost;
                        q.push(dest);
                    }
                }
                else
                {
                    if (distante[dest]>distante[sus]-cost)
                    {
                        distante[dest]=distante[sus]-cost;
                        q.push(dest);
                    }
                }
            }
            else if (dest<from && sus<from)
            {
                if (dest<sus)
                {
                    if (distante[dest]>distante[sus]+cost)
                    {
                        distante[dest]=distante[sus]+cost;
                        q.push(dest);
                    }
                }
                else
                {
                    if (distante[dest]>distante[sus]-cost)
                    {
                        distante[dest]=distante[sus]-cost;
                        q.push(dest);
                    }
                }
            }
            else if (dest<from && sus>from || sus<from && dest>from)
            {
                if (distante[dest]>cost-distante[sus])
                {
                    distante[dest]=cost-distante[sus];
                    q.push(dest);
                }
            }
            if (dest==to)
            {
                g << distante[to];
                return;
            }
        }
    }
    if (distante[to]!=99999999)
    {
        g<< distante[to];
    }
}

int main()
{
    citire();
    rezolvare();
    return 0;
}