Pagini recente » Cod sursa (job #1369474) | Cod sursa (job #1778720) | Cod sursa (job #494535) | Cod sursa (job #2077520) | Cod sursa (job #2490032)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k, l = 0x3f3f3f3f, C[15], D[15][2001];
vector<pair<int, int>> G[2001];
int F[15] = {0};
void Dijkstra(int nod);
void BackPeBiti();
int main()
{
// citire
fin >> n >> m >> k;
for (int i = 0; i < k; ++i)
fin >> C[i];
for (int i = 0; i < m; ++i)
{
int x, y, z;
fin >> x >> y >> z;
G[x].emplace_back(y, z);
G[y].emplace_back(x, z);
}
// fac un Dijkstra din fiecare nod prin care trebuie sa trec
for (int i = 0; i < k; ++i)
{
for (int j = 1; j <= n; ++j)
D[i][j] = 0x3f3f3f3f;
}
for (int i = 0; i < k; ++i)
Dijkstra(i);
BackPeBiti(); // toate posibilitatile de ordine a nodurilor obligatorii
fout << l;
/*
for (int i = 0 ; i < k; ++i)
{
cout << "D[" << i << "]: ";
for (int j = 1; j <= n; ++j)
cout << "{" << j << "," << D[i][j] << "}";
cout << '\n';
}
*/
return 0;
}
void Dijkstra(int iNod)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
Q.emplace(0, C[iNod]);
D[iNod][C[iNod]] = 0;
while (!Q.empty())
{
int nod = Q.top().second;
Q.pop();
for (pair<int, int> v : G[nod])
{
if (D[iNod][nod] + v.second < D[iNod][v.first])
{
D[iNod][v.first] = D[iNod][nod] + v.second;
Q.emplace(v.second, v.first);
}
}
}
}
void Back(int p, int nod, int c)
{
for (int i = 0; i < k; ++i)
{
if (!F[i])
{
F[i] = true;
c += D[i][nod];
if (p == k)
{
if (c + D[i][n] < l)
l = c + D[i][n];
}
else Back(p + 1, C[i], c);
F[i] = false;
c -= D[i][nod];
}
}
}
void BackPeBiti()
{
Back(1, 1, 0);
}