Pagini recente » Rating Calugaru Robert (StrategicFail) | Cod sursa (job #2434843) | Cod sursa (job #969743) | Istoria paginii utilizator/branzateona | Cod sursa (job #2841092)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int oo = 2e9;
int n, m, k, c[18], d[2001], f[2001], dist[18][18];
long long dp[1<<17][17];
struct elem {int id, cost;};
vector<elem> g[2001];
vector<int> g2[2001];
struct comp {bool operator()(int i, int j) {return d[i] > d[j];}};
priority_queue<int, vector<int>, comp> q;
void read()
{
in >> n >> m >> k;
c[1] = 1, k++;
for(int i = 2; i <= k; ++i)
in >> c[i];
c[++k] = n;
int x, y, cc;
while(m--)
{
in >> x >> y >> cc;
g[x].push_back({y, cc});
g[y].push_back({x, cc});
}
}
void dijkstra(int s)
{
for(int i = 1; i <= n; ++i)
d[i] = oo, f[i] = 0;
q.push(s);
f[s] = 1;
d[s] = 0;
int x;
while(!q.empty())
{
x = q.top();
f[x] = 0;
q.pop();
for(auto i : g[x])
if(d[x] + i.cost < d[i.id])
{
d[i.id] = d[x] + i.cost;
if(f[i.id] == 0)
q.push(i.id),
f[i.id] = 1;
}
}
}
void solve()
{
for(int i = 0; i < (1<<k); ++i)
for(int j = 0; j < k; ++j)
dp[i][j] = oo;
dp[1][0] = 0;
for(int i = 0; i < (1<<k); ++i)
for(int j = 0; j < k; ++j)
if(i & (1<<j))
for(auto p : g2[j])
if(i & (1<<p))
dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][p] + dist[p][j]);
}
void afis()
{
long long sol = oo;
for(auto i : g2[0])
sol = min(sol, dp[(1<<k) - 1][i]);
out << sol;
}
int main()
{
read();
for(int i = 0; i < k; ++i)
for(int j = 0; j < k; ++j)
dist[i][j] = oo;
for(int i = 1; i <= k; ++i)
{
dijkstra(c[i]);
for(int j = 1; j <= k; ++j)
{
dist[i-1][j-1] = d[c[j]];
if(dist[i-1][j-1] != oo)
g2[i-1].push_back(j-1),
g2[j-1].push_back(i-1);
}
}
solve();
afis();
return 0;
}