Cod sursa(job #1052725)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 11 decembrie 2013 19:09:28
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>

const static int NMAX = 30002;

using namespace std;

ifstream input("sate.in");
ofstream output("sate.out");
int X , Y , N , M;
vector<int> graph[NMAX];
vector<int> cost[NMAX];
bool sel[NMAX];
long long dist[NMAX];
queue<int> coada;

int main()
{

	// parsez citirea.
    X = Y = N = M = 0;
    register int nod , vecin , i;
    register int poz = -1;
    string line;
    getline(input , line);
    int line_size = line.length();

    for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
        N = N * 10 + (line[poz] - '0');
    for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
        M = M * 10 + (line[poz] - '0');
    for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
        X = X * 10 + (line[poz] - '0');
    for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
        Y = Y * 10 + (line[poz] - '0');
    int x , y , c;
    for (int i = 0; i < M ; i++)
    {
        getline(input , line);
        int line_size = line.length();
        poz = -1;
        x = y = c = 0;
        for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
            x = x * 10 + (line[poz] - '0');
        for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
            y = y * 10 + (line[poz] - '0');
        for (poz = poz + 1; line[poz] != ' ' && poz < line_size; poz++)
            c = c * 10 + (line[poz] - '0');
        graph[x].push_back(y);
        graph[y].push_back(x);
        cost[x].push_back(c);
        cost[y].push_back(c);
    }

    //

    coada.push(X);
    sel[X] = true;
    while (!coada.empty())
    {
        nod = coada.front();
        coada.pop();
        for (i = 0 ; i< graph[nod].size(); i++)
        {
            vecin = graph[nod][i];
            if (!sel[vecin])
            {
                sel[vecin] = true;
                if (vecin < nod)
                {
                    dist[vecin] = dist[nod] - cost[nod][i];
                }
                else
                {
                    dist[vecin] = dist[nod] + cost[nod][i];
                }
                coada.push(vecin);
            }
        }
    }
    output << dist[Y];
    input.close();
    output.close();
    return 0;
}