Pagini recente » Cod sursa (job #1080219) | Cod sursa (job #2484803) | Cod sursa (job #3001883) | Cod sursa (job #2531600) | Cod sursa (job #2537187)
#include <bits/stdc++.h>
#define dim 2005
#define kmax (1<<15)+5
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
const int inf=1e9;
int n,m,k;
int city[20],dp[dim][dim];
int ans[kmax][20];
vector <pair <int,int> > graph[dim];
priority_queue < pair<int, int>, vector < pair<int, int> >,greater< pair<int, int> > > q;
void Read()
{ f>>n>>m>>k;
for(int i=1; i<=k; ++i) f>>city[i];
for(int i=1; i<=m; ++i)
{ int x,y,cost;
f>>x>>y>>cost;
graph[x].push_back(make_pair(cost,y));
graph[y].push_back(make_pair(cost,x));
}
}
void Dijkstra(int node)
{ for(int i=1; i<=n; ++i) dp[node][i]=inf;
dp[node][node]=0;
q.push(make_pair(0,node));
while(!q.empty())
{ int node1=q.top().second;
int dist=q.top().first;
q.pop();
if(dist!=dp[node][node1])continue;
for(int i=0; i<graph[node1].size(); ++i)
{ int son=graph[node1][i].second;
int dist1=graph[node1][i].first;
if(dp[node][son]>dist1+dist)
{ dp[node][son]=dist1+dist;
q.push(make_pair(dp[node][son],son));
}
}
}
}
void Solve()
{ Dijkstra(1);
for(int i=1; i<=k; ++i) Dijkstra(city[i]);
if(k==0)
{ g<<dp[1][n];
return;
}
for(int i=1; i<(1<<k); ++i)
for(int j=1; j<=n; ++j) ans[i][j]=inf;
for(int i=1; i<=k; ++i)
ans[1<<(i-1)][i]=dp[1][city[i]];
for(int i=1; i<(1<<k); ++i)
for(int j=1; j<=k; ++j)
if(i&(1<<(j-1)))
for(int q=1; q<=k; ++q)
if((i&(1<<(q-1)))&&q!=j)
ans[i][j]=min(ans[i][j],ans[i^(1<<(j-1))][q]+dp[city[q]][city[j]]);
int Min=inf;
for(int i=1; i<=k; ++i)
Min=min(ans[(1<<k)-1][i]+dp[city[i]][n],Min);
g<<Min;
}
int main()
{ Read();
Solve();
return 0;
}