Cod sursa(job #1370513)

Utilizator devilz05Orzan Alexandru devilz05 Data 3 martie 2015 15:17:50
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <queue>
#include <list>
#include <fstream>

using namespace std;

struct Edge
{
    int x, dist;
    Edge(int x, int dist) : x(x), dist(dist) {};
};

void read(list<Edge*>* &nodes, int &n, int &start, int &end)
{
    ifstream f("sate.in");
    int x, y, dist, m;
    
    f >> n >> m >> start >> end;
    
    nodes = new list<Edge*>[n+1];
    for (int i = 0; i < m; ++i)
    {
        f >> x >> y >> dist;
        nodes[x].push_back(new Edge(y, dist));
        nodes[y].push_back(new Edge(x, dist));
    }
    f.close();
}

int findDist(list<Edge*>* &nodes, int n, int start, int end)
{
    queue<int> Q;
    bool visited[n+1];
    int dist[n+1], node;
    
    for (int i = 0; i < n+1; ++i) visited[i] = false;
    
    dist[start] = 0;
    visited[start] = true;
    Q.push(start);
    node = start;
    while (!Q.empty() && node != end)
    {
        node = Q.front();
        Q.pop();
        
        for (list<Edge*>::iterator i = nodes[node].begin(); i != nodes[node].end(); ++i)
        {
            if (!visited[(*i)->x])
            {
                Q.push((*i)->x);
                if (node < (*i)->x)
                    dist[(*i)->x] = dist[node] + (*i)->dist;
                else
                    dist[(*i)->x] = dist[node] - (*i)->dist;
                visited[(*i)->x] = true;
            }
        }
    }
    
    ofstream f("sate.out");
    f << dist[end];
    f.close();
}

int main()
{
    list<Edge*> *nodes;
    int n, x, y;
    
    read(nodes, n, x, y);
    findDist(nodes, n, x, y);
    
    return 0;
}