Cod sursa(job #1428115)

Utilizator bogdanciurezubogdan ciurezu bogdanciurezu Data 3 mai 2015 18:32:20
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#define nmax 2500

using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");


vector <pair <int, int> > graf[nmax];
set <pair <int, int> > S;
int v[nmax], N, M, K, Suma, costuri[nmax];
void initalizare(int nod){
    int i;
    for(i = 1; i <= N; ++i)
        costuri[i] = nmax;
    costuri[nod] = 0;
}
void afisare(){
    for(int i = 1; i <= N; ++i)
        cout<<costuri[i]<<' ';
    cout<<'\n';
}
int dijkstra(int inceput, int sosire){
    int val, nod, i;
    initalizare(inceput);
    S.insert(make_pair(costuri[inceput], inceput) );
    while(!S.empty()){
        val = (*S.begin() ).first;
        nod = (*S.begin() ).second;

        S.erase(*S.begin() );

        for(i = 0; i < graf[nod].size(); ++i){
            if(costuri[graf[nod][i].first] > val + graf[nod][i].second ){
                S.erase(make_pair(costuri[graf[nod][i].first], graf[nod][i].first) );
                costuri[graf[nod][i].first] = val + graf[nod][i].second;
                S.insert(make_pair(costuri[graf[nod][i].first], graf[nod][i].first) );
            }
        }
    }
    //afisare();
    return costuri[sosire];
}
int main()
{int i, a, b, c;
    f>>N>>M>>K;

    v[1] = 1;
    for(i = 2; i <= K + 1; ++i)
        f>>v[i];
    v[K + 2] = N;

    for(i = 1; i <= M; ++i){
        f>>a>>b>>c;
        graf[a].push_back(make_pair(b, c) );
        graf[b].push_back(make_pair(a, c) );
    }

    for(i = 1; i <= K + 1; ++i)
       //cout<<"da"<<'\n';
       Suma += dijkstra( v[i], v[i + 1] );

    g<<Suma<<'\n';
    return 0;
}