Pagini recente » Cod sursa (job #2100563) | Cod sursa (job #1995475) | Cod sursa (job #3213717) | Cod sursa (job #2835646) | Cod sursa (job #2721171)
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define x first
#define y second
#define pi pair<int,int>
#define pl pair<ll,ll>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const ll N=2e3+5,INF=1e18,MOD=100003,M=1e2+5,inf=INT_MAX;
int n,m,k;
int dist[N],d[20][20],v[20],dp[1<<18][20];
vector<pair<int,int> >adj[N];
void dijkstra(int node)
{
priority_queue<pair<int,int> > pq;
for(int i=1;i<=n;i++)
{
dist[i]=1e9;
}
pq.push({0,node});
dist[node]=0;
while(!pq.empty())
{
int a=pq.top().second;
pq.pop();
for(int i=0;i<adj[a].size();i++)
{
int b=adj[a][i].first;
int cost=adj[a][i].second;
if(dist[b]>dist[a]+cost)
{
dist[b]=dist[a]+cost;
pq.push({-dist[b],b});
}
}
}
}
int main()
{
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
fin>>v[i];
}
v[0]=1;
v[k+1]=n;
for(int i=1;i<=m;i++)
{
int a,b,c;
fin>>a>>b>>c;
adj[a].pb({b,c});
adj[b].pb({a,c});
}
for(int i=0;i<=k+1;i++)
{
dijkstra(v[i]);
for(int j=0;j<=k+1;j++)
{
d[i][j]=dist[v[j]];
}
if(i)d[i][i]=1e9;
}
for(int i=0;i<(1<<(k+2));i++)
{
for(int j=0;j<=k+1;j++)
{
dp[i][j]=1e9;
}
}
dp[0][0]=0;
for(int i=0;i<(1<<(k+2));i++)
{
for(int j=0;j<=k+1;j++)
{
if(i&(1<<j))
{
for(int p=0;p<=k+1;p++)
{
dp[i][j]=min(dp[i][j],dp[i^(1<<j)][p]+d[p][j]);
}
}
}
}
fout<<dp[(1<<(k+2))-1][k+1];
}