Pagini recente » Cod sursa (job #1470429) | Cod sursa (job #2223408) | Cod sursa (job #1363053) | Cod sursa (job #2120191) | Cod sursa (job #1904725)
#include <bits/stdc++.h>
#define pii pair <int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define Nmax 2005
#define INF 1000000000
using namespace std;
int n,m,k,wh[20],dp[(1<<15)][20],D[Nmax],Dist[20][20];
vector <pii> L[Nmax];
priority_queue <pii> Q;
inline void Dijkstra(int nod)
{
int i;
pii w,w1;
for(i=1;i<=n;++i) D[i]=INF;
D[nod]=0; Q.push(mp(0,nod));
while(!Q.empty())
{
w=Q.top(); Q.pop();
for(auto it : L[w.se])
{
w1.se=it.fi;
w1.fi=-w.fi+it.se;
if(D[w1.se] > w1.fi)
{
D[w1.se] = w1.fi;
Q.push(mp(-w1.fi,w1.se));
}
}
}
}
int main()
{
int x,y,z,i,j,t;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
cin>>n>>m>>k;
for(i=1;i<=k;++i) cin>>wh[i];
while(m--)
{
cin>>x>>y>>z;
L[x].pb(mp(y,z));
L[y].pb(mp(x,z));
}
for(i=0;i<(1<<k);++i)
for(j=0;j<k;++j) dp[i][j]=INF;
Dijkstra(1);
if(!k)
{
cout<<D[n]<<"\n"; return 0;
}
for(i=0;i<k;++i) dp[(1<<i)][i]=D[wh[i+1]];
for(i=0;i<k;++i)
{
Dijkstra(wh[i+1]);
for(j=0;j<k;++j) Dist[i][j]=D[wh[j+1]];
}
for(i=0;i<(1<<k);++i)
for(j=0;j<k;++j)
{
if(dp[i][j]==INF) continue;
for(t=0;t<k;++t)
if(!((1<<t)&i))
dp[(i|(1<<t))][t]=min(dp[(i|(1<<t))][t],dp[i][j]+Dist[j][t]);
}
Dijkstra(n);
int ans=INF;
for(j=0;j<k;++j) ans=min(ans,dp[(1<<k)-1][j]+D[wh[j+1]]);
cout<<ans<<"\n";
return 0;
}