Pagini recente » Cod sursa (job #386925) | Cod sursa (job #2023592) | Cod sursa (job #1505136) | Cod sursa (job #2002300) | Cod sursa (job #2347897)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int DIM = 2007;
const int INF = 1e9;
vector <pair <int, int> > v[DIM];
int n;
bitset <DIM> vis;
int d[DIM][DIM];
int best[(1 << 17)][20];
void dijkstra(int start, int d[DIM])
{
for(int i = 1; i <= n; i++)
d[i] = INF;
priority_queue <pair <int, int> > q;
d[start] = 0;
q.push({0, start});
vis[start] = 1;
while(!q.empty())
{
int nod = q.top().second;
q.pop();
vis[nod] = 0;
for(auto i : v[nod])
{
int cost = i.second;
int next = i.first;
if(d[next] > d[nod] + cost)
{
d[next] = d[nod] + cost;
if(vis[next] == 0)
{
vis[next] = 1;
q.push({-d[next], next});
}
}
}
}
}
int oras[20];
int main()
{
int m, k;
in >> n >> m >> k;
for(int i = 1; i <= k; i++)
in >> oras[i];
while(m--)
{
int x, y, c;
in >> x >> y >> c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
dijkstra(1, d[1]);
for(int i = 1; i <= k; i++)
dijkstra(oras[i], d[oras[i]]);
if(k == 0)
{
out << d[1][n];
return 0;
}
for(int i = 1; i < (1 << k); i++)
for(int j = 1; j <= n; j++)
best[i][j] = INF;
for(int i = 1; i <= k; i++)
best[(1 << (i - 1))][i] = d[1][oras[i]];
for(int i = 1; i < (1 << k); i++)
for(int j = 1; j <= k; j++)
if(i & (1 << (j - 1)))
for(int t = 1; t <= k; t++)
if(t != j && (i & (1 << (t - 1))))
best[i][j] = min(best[i][j], best[i ^ (1 << (j - 1))][t] + d[oras[t]][oras[j]]);
int mi = INF;
for(int i = 1; i <= k; i++)
mi = min(mi, best[(1 << k) - 1][i] + d[oras[i]][n]);
out << mi;
}