Pagini recente » Borderou de evaluare (job #564024) | Cod sursa (job #205546) | Cod sursa (job #3274965) | Cod sursa (job #1976987) | Cod sursa (job #3309142)
#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> dp;
vector<vector<pair<int, int>>> g1, g2;
vector<int> dijkstra(int source)
{
priority_queue<pair<int, int>> p;
const int INF = 2e9;
vector<int> dist(n + 1, INF);
p.push({-0, source});
dist[source] = 0;
while(!p.empty())
{
int c = -p.top().first;
int k = p.top().second;
p.pop();
if(c != dist[k])
continue;
for(auto it = g1[k].begin(); it != g1[k].end(); it++)
{
if(dist[(*it).first] > dist[k] + (*it).second)
{
dist[(*it).first] = dist[k] + (*it).second;
p.push({-dist[(*it).first], (*it).first});
}
}
}
return dist;
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
cin.tie(nullptr)->sync_with_stdio(false);
int m;
cin >> n >> m;
g1.resize(n + 1);
int k;
cin >> k;
g2.resize(k + 3);
dp.resize(1 << k, vector<int>(k, 1e9));
vector<int> v;
for(int i = 0; i < k; i++)
{
int x;
cin >> x;
v.push_back(x);
}
for(int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
g1[x].push_back({y, z});
g1[y].push_back({x, z});
}
vector<int> di = dijkstra(1);
for(auto it = v.begin(); it != v.end(); ++it)
{
g2[1].push_back({*it, di[*it]});
}
g2[1].push_back({n, di[n]});
for(auto it = v.begin(); it != v.end(); ++it)
{
vector<int> d = dijkstra(*it);
g2[it - v.begin() + 2].push_back({1, d[1]});
for(auto jt = v.begin(); jt != v.end(); ++jt)
{
if(it != jt)
{
g2[it - v.begin() + 2].push_back({*jt, d[*jt]});
}
}
g2[it - v.begin() + 2].push_back({n, d[n]});
}
di = dijkstra(n);
g2[k + 2].push_back({1, di[1]});
for(auto it = v.begin(); it != v.end(); ++it)
{
g2[k + 2].push_back({*it, di[*it]});
}
for(int i = 0; i < k; i++)
{
for(auto it = g2[1].begin(); it != g2[1].end(); ++it)
{
if((*it).first == v[i])
{
dp[1 << i][i] = (*it).second;
break;
}
}
}
for(int msk = 0; msk < (1 << k); msk++)
{
for(int u = 0; u < k; u++)
{
if(!(msk & (1 << u)) || dp[msk][u] == 1e9)
continue;
for(int w = 0; w < k; w++)
{
if(msk & (1 << w))
continue;
int ds = 1e9;
for(auto it = g2[u + 2].begin(); it != g2[u + 2].end(); ++it)
{
if((*it).first == v[w])
{
ds = (*it).second;
break;
}
}
dp[msk | (1 << w)][w] = min(dp[msk | (1 << w)][w], dp[msk | (1 << w)][u] + ds);
}
}
}
int ans = 1e9;
int vis = (1 << k) - 1;
for(int i = 0; i < k; i++)
{
if(dp[vis][i] != 1e9)
{
int ds = 1e9;
for(auto it = g2[i + 2].begin(); it != g2[i + 2].end(); ++it)
{
if((*it).first == n)
{
ds = (*it).second;
break;
}
}
ans = min(ans, dp[vis][i] + ds);
}
}
cout << ans;
return 0;
}