Pagini recente » Cod sursa (job #2596731) | Cod sursa (job #334008) | Cod sursa (job #1838280) | Cod sursa (job #493030) | Cod sursa (job #1716250)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 2000
#define LOCALITATI_MAX 15
vector< pair<int, int> > ad[NMAX + 1];
int distanteMinime[NMAX + 1][NMAX + 1];
int localitati[LOCALITATI_MAX + 1];
vector<int> distante(NMAX + 1);
vector<bool> inCoada(NMAX + 1);
void aflaDistante(int indice);
bool cmp(int a, int b);
int main()
{
FILE *fin = fopen("ubuntzei.in", "r");
FILE *fout = fopen("ubuntzei.out", "w");
int n, m;
fscanf(fin, "%d%d", &n, &m);
int k;
fscanf(fin, "%d", &k);
for(int i = 1; i <= k; ++i)
fscanf(fin, "%d", &localitati[i]);
while(m--){
int x, y, cost;
fscanf(fin, "%d%d%d", &x, &y, &cost);
ad[x].push_back(make_pair(y, cost));
ad[y].push_back(make_pair(x, cost));
}
for(int i = 1; i <= n; ++i){
aflaDistante(i);
for(int j = 1; j <= n; ++j)
distanteMinime[i][j] = distante[j];
}
int suma = 0;
int locCur = 1;
for(int i = 1; i <= k; ++i){
int pozUrm = 0;
for(int j = 1; j <= k; ++j){
int loc = localitati[j];
if(loc != 0 && (pozUrm == 0 || distanteMinime[locCur][loc] < distanteMinime[locCur][localitati[pozUrm]]))
pozUrm = j;
}
suma += distanteMinime[locCur][localitati[pozUrm]];
locCur = localitati[pozUrm];
localitati[pozUrm] = 0;
}
suma += distanteMinime[locCur][n];
fprintf(fout, "%d", suma);
return 0;
}
void aflaDistante(int indice){
priority_queue<int, vector<int>, decltype(&cmp)> q(&cmp);
q.push(indice);
distante.clear();
distante[indice] = 0;
while(!q.empty()){
int nod = q.top();
q.pop();
inCoada[nod] = false;
for(auto legatura : ad[nod]){
int vecin = legatura.first;
int distNou = distante[nod] + legatura.second;
if(distante[vecin] == 0 || distante[vecin] > distNou){
distante[vecin] = distNou;
if(!inCoada[vecin]){
q.push(vecin);
inCoada[vecin] = true;
}
}
}
}
}
bool cmp(int a, int b){
return distante[a] > distante[b];
}