Pagini recente » Cod sursa (job #632638) | Cod sursa (job #1169034) | Cod sursa (job #383239) | Cod sursa (job #2231109) | Cod sursa (job #2341427)
#include<bits/stdc++.h>
using namespace std;
int n,m,k,c[16],s[2009],dist[2009][2009];
vector<pair<int,int>> v[2009];
priority_queue<pair<int,int>> pq;
int dp[1<<16][16];
void dijkstra(int nod,int d[])
{
int pos,cst,next,val;
for(int i=1; i<=n; i++)
{
d[i]=1e9;
}
d[nod]=0;
pq.push({0,nod});
while(!pq.empty())
{
pos=pq.top().second;
cst=pq.top().first;
pq.pop();
if(s[pos]==0)
{
s[pos]=1;
for(int i=0; i<v[pos].size(); i++)
{
next=v[pos][i].first;
val=v[pos][i].second;
if(d[next]>d[pos]+val)
{
d[next]=d[pos]+val;
pq.push({-d[next],next});
}
}
}
}
}
int main()
{
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
fin>>n>>m>>k;
for(int i=1; i<=k; i++)
{
fin>>c[i];
}
for(int i=1; i<=m; i++)
{
int x,y,dist;
fin>>x>>y>>dist;
v[x].push_back({y,dist});
v[y].push_back({x,dist});
}
dijkstra(1,dist[1]);
for(int i=1; i<=k; i++)
{
memset(s,0,sizeof(s));
dijkstra(c[i],dist[c[i]]);
}
if(k==0)
{
fout<<dist[1][n];
return 0;
}
for(int i=1; i<(1<<k); i++)
{
for(int j=1; j<=n; j++)
{
dp[i][j]=1e9;
}
}
for(int i=1; i<=k; i++)
{
dp[1<<(i-1)][i]=dist[1][c[i]];
}
for(int i=1; i<(1<<k); i++)
{
for(int j=1; j<=k; j++)
{
if(i&(1<<(j-1)))
{
for(int l=1; l<=k; l++)
{
if(l==j)
{
continue;
}
if(i&(1<<(l-1)))
{
dp[i][j]=min(dp[i][j],dp[i^(1<<(j-1))][l]+dist[c[l]][c[j]]);
}
}
}
}
}
int ans=1e9+1;
for(int i=1; i<=k; i++)
{
ans=min(ans,dp[(1<<k)-1][i]+dist[c[i]][n]);
}
fout<<ans;
return 0;
}