Cod sursa(job #1590371)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 4 februarie 2016 22:44:01
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");

const int N_max = 2005;
const int M_max = 10005;
const int INF = 2100000005;

struct ELEMENT{int nod, dist;};
ELEMENT v[N_max];

int lst[N_max];
int vf[2 * M_max];
int urm[2 * M_max];
int cost[2 * M_max];
int nr;

vector <int> C;
int d[N_max];

int p, u;

int L_min;

int N, M, K;

void BF(int S)
{
    int i, x, y, poz, COST;

    for(i = 1; i <= N; i++) d[i] = INF;

    C.clear();

    p = u = 0;

    //INSEREZ IN COADA NODUL S
    C.push_back(S);
    d[S] = 0;

    while(p <= u)
    {
        x = C[p++];

        //PARCURG VECINII y AI LUI x

        poz = lst[x];

        while(poz != 0)
        {
            y = vf[poz];
            COST = cost[poz];

            if(d[y] > d[x] + COST)
            {
                u++;
                C.push_back(y);

                d[y] = d[x] + COST;
            }

            poz = urm[poz];
        }
    }

    //for(i = 1; i <= N; i++) cout << d[i] << " ";
    //cout << '\n';
}

void calcul_dist()
{
    int poz, x, y;

    for(int i = 1; i <= N; i++) d[i] = INF;

    //INSEREZ IN COADA NODUL 1
    C.push_back(1);
    d[1] = 0;

    while(p <= u)
    {
        x = C[p++];

        //PARCURG VECINII y AI LUI x

        poz = lst[x];

        while(poz != 0)
        {
            y = vf[poz];

            if(d[y] > 1 + d[x])
            {
                u++;
                C.push_back(y);

                d[y] = 1 + d[x];
            }

            poz = urm[poz];
        }
    }
}

bool exc(ELEMENT e1, ELEMENT e2)
{
    return e1.dist < e2.dist;
}

void adauga(int x, int y, int c)
{
    //ADAUGA IN LISTA LUI x PE y

    nr++;
    vf[nr] = y;
    urm[nr] = lst[x];
    cost[nr] = c;
    lst[x] = nr;
}

int main()
{
    int i, x, y, c;

    in >> N >> M;

    in >> K;
    for(i = 1; i <= K; i++) in >> v[i].nod;

    for(i = 1; i <= M; i++)
    {
        in >> x >> y >> c;

        adauga(x, y, c);
        adauga(y, x, c);
    }

    calcul_dist();

    for(i = 1; i <= K; i++) v[i].dist = d[ v[i].nod ];

    sort(v + 1, v + K + 1, exc);

    /*
    for(i = 1; i <= K; i++) cout << v[i].nod << " ";
    cout << '\n';
    for(i = 1; i <= K; i++) cout << v[i].dist << " ";
    cout << '\n';
    */

    BF(1);

    L_min += d[ v[1].nod ];

    //cout << L_min << '\n';

    for(i = 1; i < K; i++)
    {
        BF(v[i].nod);

        L_min += d[ v[i + 1].nod ];

        //cout << L_min << '\n';
    }

    BF(v[K].nod);

    L_min += d[ N ];

    out << L_min;

    return 0;
}