Pagini recente » Cod sursa (job #1234161) | Cod sursa (job #1278225) | Cod sursa (job #1054033) | Cod sursa (job #226684) | Cod sursa (job #1448196)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define nmx 2000
#define inf 0x3f3f3f3f
using namespace std;
int n, m, k, dist[nmx][17], sol[17], minim = inf;
bool viz[nmx];
vector <pair<int,int> > g[nmx];
vector <int> prieteni;
priority_queue <pair<int,int> > q;
void citire() {
int nod1, nod2, cost;
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= k; ++i) {
scanf("%d", &nod1);
prieteni.push_back(nod1);
}
for(int i = 1; i <= m; ++i) {
scanf("%d %d %d", &nod1, &nod2, &cost);
g[nod1].push_back(make_pair(nod2,cost));
g[nod2].push_back(make_pair(nod1,cost));
}
}
void dijkstra(const int nod_porire, const int p) {
dist[nod_porire][p] = 0;
q.push(make_pair(0,nod_porire));
int nod;
while(not q.empty()) {
nod = q.top().second;
q.pop();
for(vector<pair<int,int> >::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
if(dist[it->first][p] > dist[nod][p] + it->second) {
dist[it->first][p] = dist[nod][p] + it->second;
q.push(make_pair(-dist[it->first][p],it->first));
}
}
}
void verif(){
int sum = dist[prieteni[sol[0]-1]][0];
for(int i = 1; i < k; ++i)
sum += dist[prieteni[sol[i]-1]][sol[i-1]];
sum += dist[n][sol[k-1]];
minim = minim > sum ? sum : minim;
}
void aranj(const int pos) {
if(pos == k) {
verif();
return;
}
for(int i = 1; i <= k; ++i)
if(not viz[i]) {
viz[i] = 1;
sol[pos] = i;
aranj(pos + 1);
viz[i] = 0;
}
}
int main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
citire();
memset(dist, inf, sizeof(dist));
dijkstra(1,0);
for(int i = 0; i < k; ++i)
dijkstra(prieteni[i],i+1);
aranj(0);
printf("%d\n", minim);
return 0;
}