Pagini recente » Cod sursa (job #2904127) | Cod sursa (job #1968697) | Cod sursa (job #710063) | Cod sursa (job #1908033) | Cod sursa (job #1428115)
#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;
}