Pagini recente » Cod sursa (job #3340020) | Cod sursa (job #3332944) | Cod sursa (job #3330509) | Cod sursa (job #3343289) | Cod sursa (job #3341194)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
#define in fin
#define out fout
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef pair<int, int> pii;
const int MAXN = 2e3;
const int MAXM = 1e4;
const int MAXK = 15; // hmm
const int INF = 1e9;
int n, m, kc, cx, x, y, z, dmin;
int orase[MAXK+1];
int st[MAXN+1], viz[MAXN+1];
vector<pii> graf[MAXN+1];
vector<vector<int>> distante(MAXN+2, vector<int>(MAXN+2, INF));
map<int, bool> trebuie_vizitat;
void citire();
void afisdv();
void dijkstra(int init, vector<int> &dist) {
priority_queue<pii, vector<pii>, greater<pii>> pq;
dist[init] = 0;
pq.push({ 0, init });
while (!pq.empty()) {
int nod = pq.top().second;
int distInit = pq.top().first;
pq.pop();
if (distInit > dist[nod])
continue;
for (auto e: graf[nod]) {
int nodExt = e.first;
int cost = e.second;
if (dist[nodExt] > dist[nod] + cost) {
dist[nodExt] = dist[nod] + cost;
pq.push({ dist[nodExt], nodExt });
}
}
}
}
void bk(int k, int nod, int suma) {
if (k == kc + 1) {
dmin = min(dmin, suma + distante[nod][n]);
return;
}
st[k] = nod;
viz[nod] = true;
for (int i = 1; i <= kc; i++) {
if (!viz[orase[i]]) {
bk(k + 1, orase[i], suma + distante[nod][orase[i]]);
}
}
viz[nod] = false;
}
signed main() {
citire();
dijkstra(1, distante[1]);
for (int i = 1; i <= kc; i++)
dijkstra(orase[i], distante[ orase[i] ]);
dmin = 2e9;
// st[k] = 1, fr[1] = 1;
bk(1, 1, 0);
out << dmin;
return 0;
}
void citire() {
in >> n >> m >> kc;
for (int i = 1; i <= kc; i++)
in >> orase[i], trebuie_vizitat[orase[i]] = true;
for (int i = 1; i <= m; i++) {
in >> x >> y >> z;
graf[x].push_back({y, z});
graf[y].push_back({x, z});
}
}
void afisdv() {
for (int i = 1; i <= n; i++)
cout << distante[1][i] << ' '; cout << '\n';
for (int i = 1; i <= kc; i++) {
for (int j = 1; j <= n; j++)
cout << distante[orase[i]][j] << ' ';
cout << '\n';
}
}