Pagini recente » Cod sursa (job #1669157) | Cod sursa (job #2413441) | Cod sursa (job #142698) | Cod sursa (job #1980258) | Cod sursa (job #2340637)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#include <cstring>
using namespace std;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
const int NMAX=2005,INF=1e9;
int n,m,k,u[20],bst[NMAX][NMAX],x,y,cost,VIZ[NMAX],dp[20][(1<<16)+5];
priority_queue <pair <int,int>> pq;
vector <pair<int,int>> V[NMAX];
void dijkstra(int s)
{
memset(VIZ,0,sizeof(VIZ));
for(int i=1;i<=n;i++)
bst[s][i]=INF;
pq.push({0,s});
bst[s][s]=0;
while(!pq.empty())
{
auto p=pq.top();
pq.pop();
int x=p.second;
if(VIZ[x]) continue;
VIZ[x]=1;
for(auto edge: V[x])
{
y=edge.first;
cost=edge.second;
if(bst[s][y]>bst[s][x]+cost)
{
bst[s][y]=bst[s][x]+cost;
VIZ[y]=0;
pq.push({-bst[s][y],y});
}
}
}
}
int main()
{
fi>>n>>m>>k;
for(int i=0;i<k;i++)
{
fi>>x;
u[i]=x;
}
for(int i=1;i<=m;i++)
{
fi>>x>>y>>cost;
V[x].push_back({y,cost});
V[y].push_back({x,cost});
}
dijkstra(1);
for(int i=0;i<k;i++)
{
dijkstra(u[i]);
dp[i][(1<<i)]=bst[u[i]][1];
}
for(int conf=0;conf<(1<<k);conf++)
for(int i=0;i<k;i++)
if(conf&(1<<i) && (conf-(1<<i))!=0)
{
dp[i][conf]=INF;
for(int j=0;j<k;j++)
if(j!=i && bst[u[i]][u[j]]!=INF && conf&(1<<j))
dp[i][conf]=min(dp[i][conf],dp[j][conf-(1<<i)]+bst[u[i]][u[j]]);
}
int rez=INF;
if(!k) rez=bst[1][n];
for(int i=0;i<k;i++)
if(bst[u[i]][n]!=INF)
rez=min(rez,dp[i][(1<<k)-1]+bst[u[i]][n]);
fo<<rez<<"\n";
fi.close();
fo.close();
return 0;
}