Pagini recente » Cod sursa (job #1507214) | Cod sursa (job #566966) | Cod sursa (job #220895) | Cod sursa (job #392880) | Cod sursa (job #2373414)
#include <bits/stdc++.h>
#define dim 2005
#define inf int(1e9)
#define kmax (1<<15)+5
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
int city[20],dp[dim][dim];
int ans[kmax][20];
struct ubuntzei
{
int cost,x;
};
vector <ubuntzei> 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({cost,y});
graph[y].push_back({cost,x});
}
}
void Dijkstra(int node)
{
for(int i=1; i<=n; ++i)
dp[node][i]=inf;
dp[node][node]=0;
q.push({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].x;
int dist1=graph[node1][i].cost;
if(dp[node][son]>dist1+dist)
{
dp[node][son]=dist1+dist;
q.push({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;
}