Pagini recente » Cod sursa (job #1056775) | Cod sursa (job #3256792) | Cod sursa (job #1004303) | Cod sursa (job #2607089) | Cod sursa (job #2544469)
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("ubuntzei.in");
ofstream h("ubuntzei.out");
typedef long long ll;
int n,m,k,x,y,cost,mask2;
vector<pair<int,int>> G[2001];
ll dist[20][2001];
ll dp[33000][20];
int orase[2001];
ll ans = oo;
void dijkstra(int nod,ll d[])
{
for(int i = 0;i <= n;++i)
d[i] = oo;
d[nod] = 0;
set<pair<int,int>> h;
h.insert(make_pair(0,nod));
while(!h.empty())
{
int node = h.begin() -> second;
int di = h.begin() -> first;
h.erase(h.begin());
for(vector<pair<int,int>>::iterator it = G[node].begin();it != G[node].end();++it)
{
int to = it -> first;
int cost = it -> second;
if(d[to] > d[node] + cost)
{
if(d[to] != oo)
h.erase(h.find(make_pair(d[to],to)));
d[to] = d[node] + cost;
h.insert(make_pair(d[to],to));
}
}
}
}
void Read()
{
f>>n>>m;
f>>k;
for(int i = 0;i < k;++i)
f>>orase[i];
for(int i = 1;i <= m;++i)
{
f>>x>>y>>cost;
G[x].push_back(make_pair(y,cost));
G[y].push_back(make_pair(x,cost));
}
}
void Solve()
{
for(int i = 0;i < k;++i)
dijkstra(orase[i],dist[i]);
dijkstra(1,dist[k]);
if(!k)
{
g<<dist[0][n]<<'\n';
return;
}
for(int mask = 1;mask < (1 << k);++mask)
for(int pos = 0;pos < k;++pos)
if(mask & (1 << pos))
{
ll mask2 = mask ^ (1 << pos);
if(mask2 == 0)
{
dp[mask][pos] = dist[k][orase[pos]];
break;
}
dp[mask][pos] = oo;
for(int i = 0;i < k;++i)
if(mask2 & (1 << i))
dp[mask][pos] = min(dp[mask][pos],dp[mask2][i] + dist[i][orase[pos]]);
}
ll mask = (1 << k) - 1;
for(int i = 0;i < k;++i)
ans = min(ans,dp[mask][i] + dist[i][n]);
h<<ans;
h.close();
}
int main()
{
Read();
Solve();
return 0;
}