Pagini recente » Cod sursa (job #725465) | Cod sursa (job #3293411) | Cod sursa (job #1903062) | Cod sursa (job #2963050) | Cod sursa (job #2568491)
#include <bits/stdc++.h>
#define dim 2005
#define inf INT_MAX
#define dimm 1<<(17)
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,k,m;
int city[20],dist[dim][dim],dp[dimm][20];
struct point
{
int cost,x;
bool operator <(const point & other) const
{
return cost>other.cost;
}
};
priority_queue <point> q;
vector <point> graph[dim];
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)
dist[node][i]=inf;
dist[node][node]=0;
q.push({0,node});
while(!q.empty())
{
int son=q.top().x,cost=q.top().cost;
q.pop();
if(cost!=dist[node][son])continue;
for(int i=0; i<graph[son].size(); ++i)
{
int nextt=graph[son][i].x;
int cost1=graph[son][i].cost;
if(dist[node][nextt]>dist[node][son]+cost1)
{
dist[node][nextt]=cost1+dist[node][son];
q.push({dist[node][nextt],nextt});
}
}
}
}
void Solve()
{
Dijkstra(1);
for(int i=1; i<=k; ++i)
Dijkstra(city[i]);
if(k==0)
{
g<<dist[1][n];
return;
}
for(int i=1; i<(1<<k); ++i)
for(int j=1; j<=n; ++j)
dp[i][j]=inf;
for(int i=1; i<=k; ++i)
dp[(1<<(i-1))][i]=dist[1][city[i]];
for(int stare=1; stare<(1<<k); ++stare)
for(int oras=1; oras<=k; ++oras)
if(stare&(1<<(oras-1))) // trecem prin orasul oras
for(int j=1; j<=k; ++j)
if(stare&(1<<(j-1))&&j!=oras) // trecem printr-un oras de mijloc
dp[stare][oras]=min(dp[stare][oras],
dp[stare^(1<<(oras-1))][j]
+dist[city[j]][city[oras]]);
int ans=inf;
for(int i=1; i<=k; ++i)
ans=min(ans,dp[(1<<k)-1][i]+dist[city[i]][n]);
g<<ans;
}
int main()
{
Read();
Solve();
return 0;
}