Pagini recente » Cod sursa (job #1423574) | Cod sursa (job #2972925) | Cod sursa (job #1650967) | Cod sursa (job #2875135) | Cod sursa (job #2561725)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
const int N = 2005, oo = 1e9 + 5;
typedef pair <int, int> pii;
int dist[20][20], C[20], d[N], st[20], n, k, W, sol;
vector <pii> L[N];
priority_queue <pii, vector<pii>, greater<pii> > q;
bitset <20> seen;
void Read ()
{
ifstream fin ("ubuntzei.in");
int m;
fin >> n >> m;
fin >> k;
for (int i = 1; i <= k; i++)
{
fin >> C[i];
W = W ^ i;
}
while (m--)
{
int x, y, c;
fin >> x >> y >> c;
L[x].push_back({y, c});
L[y].push_back({x, c});
}
}
void Dijkstra (int vertex)
{
for (int i = 1; i <= n; i++)
d[i] = oo;
q.push({0, vertex});
d[vertex] = 0;
while (!q.empty())
{
int currvertex = q.top().second;
q.pop();
for (auto next : L[currvertex])
{
if (d[next.first] > d[currvertex] + next.second)
{
d[next.first] = d[currvertex] + next.second;
q.push({d[next.first], next.first});
}
}
}
}
void BuildMatrix ()
{
for (int i = 1; i <= k; i++)
{
Dijkstra(C[i]);
dist[0][i] = dist[i][0] = d[1];
dist[k + 1][i] = dist[i][k + 1] = d[n];
for (int j = 1; j <= k; j++)
dist[i][j] = d[C[j]];
}
}
void Compute ()
{
int cost = 0;
st[k] = W;
for (int i = 1; i <= k; i++)
cost += dist[st[i - 1]][st[i]];
cost += dist[st[k]][k + 1];
sol = min (sol, cost);
}
void Back (int top)
{
if (top == k) Compute();
else for (int i = 1; i <= k; i++)
if (!seen[i])
{
st[top] = i;
W ^= i;
seen[i] = 1;
Back(top + 1);
seen[i] = 0;
W ^= i;
}
}
int main()
{
Read();
BuildMatrix();
sol = oo;
Back(1);
ofstream fout ("ubuntzei.out");
fout << sol << "\n";
fout.close();
return 0;
}