Pagini recente » Cod sursa (job #644695) | Cod sursa (job #668373) | Cod sursa (job #2781923) | Cod sursa (job #310250) | Cod sursa (job #1862460)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int inf = 0x3f3f3f3f;
int n, m, k,len[17][17], dist[2005], dp[1 << 17][17];
vector <pair<int, int> > g[2005];
vector <int> s;
inline void dijkstra(int stnode)
{
priority_queue<pair<int, int> > q;
memset(dist, inf, sizeof(dist));
dist[stnode] = 0;
q.push(make_pair(0, stnode));
while(!q.empty()) {
int node = q.top().second;
int cost = -q.top().first;
q.pop();
if(dist[node] < cost)
continue;
for(auto it: g[node])
if(dist[it.first] > cost + it.second) {
dist[it.first] = cost + it.second;
q.push(make_pair(-dist[it.first], it.first));
}
}
}
int main()
{
fin >> n >> m;
fin >> k;
s.push_back(0);
for(int i = 1 ; i <= k ; ++ i) {
int x;
fin >> x;
-- x;
s.push_back(x);
}
s.push_back(n - 1);
for(int i = 1 ; i <= m ; ++ i)
{
int x, y, c;
fin >> x >> y >> c;
-- x;
-- y;
g[x].push_back(make_pair(y, c));
g[y].push_back(make_pair(x, c));
}
for(size_t i = 0 ; i < s.size() ; ++ i)
{
dijkstra(s[i]);
for(size_t j = 0 ; j < s.size() ; ++ j)
len[i][j] = dist[s[j]];
}
memset(dp, inf, sizeof(dp));
dp[1][0] = 0;
int maxmask = (1 << (s.size()));
for(int mask = 1 ; mask < maxmask ; ++ mask) {
for(size_t i = 0 ; i < s.size() ; ++ i)
if(mask & (1 << i))
for(size_t j = 0 ; j < s.size() ; ++ j)
if(mask & (1 << j))
dp[mask][i] = min(dp[mask][i], dp[mask ^ (1 << i)][j] + len[j][i]);
}
fout << dp[maxmask - 1][s.size() - 1] << '\n';
}
//Credits: floreaadrian