Cod sursa(job #1341391)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 12 februarie 2015 18:11:50
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

struct Node
{
    int index;
    int distance;
};

int bfs(int src, int dest, vector<Node> v[], int N);

int main()
{
    int N, M, X, Y, i, j, D, k;
    ifstream f("sate.in");
    f >> N >> M >> X >> Y;

    vector<Node> v[N + 1];
    Node newEntry;
    for (k = 1; k <= M; k++)
    {
        f >> i >> j >> D;
        newEntry.index = j;
        newEntry.distance = D;
        v[i].push_back(newEntry);
        newEntry.index = i;
        v[j].push_back(newEntry);
    }
    f.close();

    ofstream g("sate.out");
    g << bfs(X, Y, v, N);
    g.close();
    return 0;
}

int bfs(int src, int dest, vector<Node> v[], int N)
{
    int distToSrc[N + 1], parent[N + 1];
    bool visited[N + 1];
    fill(visited, visited + N + 1, false);
    distToSrc[src] = 0;

    queue<int> q;
    q.push(src);
    visited[src] = true;
    parent[src] = 0;
    int current = src;
    while (!q.empty() && current != dest)
    {
        current = q.front();
        q.pop();

        for (auto i = v[current].begin(); i != v[current].end(); i++)
            if (!visited[i->index])
            {
                q.push(i->index);
                parent[i->index] = current;
                if (parent[i->index] < i->index)
                    distToSrc[i->index] = distToSrc[parent[i->index]] + i->distance;
                else
                    distToSrc[i->index] = distToSrc[parent[i->index]] - i->distance;
                visited[i->index] = true;
            }
    }

    return distToSrc[dest];
}