Cod sursa(job #1255058)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 4 noiembrie 2014 11:28:05
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include <fstream>
#include <iostream>

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];
path * adiacList[30002];

int n;


long calcDist(int x, int y)
{
    path *queue_start = new path, *queue_end, *roads;
    queue_start->to = x;
    queue_start->dist = 0;
    queue_end = queue_start;
    visited[x] = 1;
    int i;
    long int d;
    while ((queue_start->next != NULL) && (queue_start->to != y))
    {
        i = queue_start->to;
        d = queue_start->dist;
        roads = adiacList[i];
        if (roads != NULL)
        {
            if (!visited[roads->to])
            {
                queue_end->next = new path;
                queue_end = queue_end->next;
                queue_end->next = NULL;
                visited[queue_end->to = roads->to] = 1;
                queue_end->dist = (i < roads->to) ? (d + roads->dist) : (d - roads->dist);
            }
            while (roads->next)
            {
                roads = roads->next;

                if (!visited[roads->to])
                {
                    queue_end->next = new path;
                    queue_end = queue_end->next;
                    queue_end->next = NULL;
                    visited[queue_end->to = roads->to] = 1;
                    queue_end->dist = (i < roads->to) ? (d + roads->dist) : (d - roads->dist);
                }
            }

        }
        roads = queue_start;
        queue_start = queue_start->next;
        delete roads;
    }
    long int dFinal = -1;
    if (queue_start != NULL)
    {
        dFinal = queue_start->dist;
        //return dFinal;
    }
    /*while (queue_start != NULL)
    {
        queue_end = queue_start;
        queue_start = queue_start->next;
        delete queue_end;
    }*/
    return dFinal;
}

int main()
{
    //FILE *fin = fopen("ciclueuler.in", "r");
    //FILE *fout = fopen("ciclueuler.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 *ptrPath;
    while (m--)
    {
        fin >> i >> j >> d;
        ptrPath = adiacList[i];
        adiacList[i] = new path;
        adiacList[i]->to = j;
        adiacList[i]->dist = d;
        adiacList[i]->next = ptrPath;

        ptrPath = adiacList[j];
        adiacList[j] = new path;
        adiacList[j]->to = i;
        adiacList[j]->dist = d;
        adiacList[j]->next = ptrPath;
        //fscanf(fin, "%d %d", &i, &j);
    }
    m = calcDist(x, y);
    //cout << m;
    fout << m << "\n";
    //fclose(fin);
    //fclose(fout);
    return 0;
}