Cod sursa(job #1256536)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 6 noiembrie 2014 14:27:41
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <list>

// Using STL now
using namespace std;

class path
{
public:
    int to;
    long dist;
    /*path *next;
    void deleteNext()
    {
        path * toDelete = next;
        if (toDelete != NULL)
        {
            next = toDelete->next;
            delete toDelete;
        }
    }*/
};

char visited[30002];
list<path> adiacList[30002];

int n;


long calcDist(int x, int y)
{
    queue<path> q;
    path roads;
    roads.to = x;
    roads.dist = 0;
    q.push(roads);
    visited[x] = 1;
    list<path>::iterator it, endIt;
    int i;
    long int d;
    while (!q.empty())
    {
        roads = q.front();
        i = roads.to;
        d = roads.dist;
        q.pop();
        if (i == y)
        {
            return d;
        }
        for (it = adiacList[i].begin(), endIt = adiacList[i].end(); it != endIt; ++it)
        {
            if (!visited[it->to])
            {
                visited[roads.to = it->to] = 1;
                roads.dist = (i < it->to) ? (d + it->dist) : (d - it->dist);
                q.push(roads);
            }
        }

    }
    return -1;
}

int main()
{
    //FILE *fin = fopen("sate.in", "r");
    //FILE *fout = fopen("sate.out", "w");

    ifstream fin("sate.in");
    ofstream fout("sate.out");
    long m;
    int i, j, d, x, y;
    //fscanf(fin, "%d %d", &n, &m);
    fin >> n >> m >> x >> y;
    path temp;
    while (m--)
    {
        fin >> i >> j >> d;
        temp.dist = d;
        temp.to = j;
        adiacList[i].push_back(temp);

        temp.to = i;
        adiacList[j].push_back(temp);
        //fscanf(fin, "%d %d", &i, &j);
    }
    m = calcDist(x, y);
    //cout << m;
    fout << m << "\n";
    //fclose(fin);
    //fclose(fout);
    return 0;
}