Pagini recente » Cod sursa (job #226923) | Cod sursa (job #455170) | Cod sursa (job #3247919) | Cod sursa (job #3284221) | Cod sursa (job #2618159)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
const int lim=2005,inf=2e9+7,doi15=32768+5;
int c[lim],dist[17][lim],dp[17][doi15];
vector<pair<int,int> > vec[lim];
set<pair<int,int> > s;
vector<int> sel;
int n,m,k,x,y,z;
void dijkstra(int ind)
{
for(int i=1;i<=n;++i)
dist[ind][i]=inf;
dist[ind][c[ind]]=0;
s.insert({0,c[ind]});
while(!s.empty())
{
int t=(*(s.begin())).first;
int x=(*(s.begin())).second;
s.erase(s.begin());
for(auto y:vec[x])
if(dist[ind][y.first]>t+y.second)
{
if(dist[ind][y.first]!=inf)
s.erase(s.find({dist[ind][y.first],y.first}));
dist[ind][y.first]=t+y.second;
s.insert({dist[ind][y.first],y.first});
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=k;++i)
cin>>c[i];
for(int i=1;i<=m;++i)
{
cin>>x>>y>>z;
vec[x].push_back({y,z});
vec[y].push_back({x,z});
}
c[0]=1;
for(int i=0;i<=k;++i)
dijkstra(i);
if(k==0)
{
cout<<dist[0][n]<<'\n';
return 0;
}
int lim=(1<<k)-1;
for(int kk=1;kk<=lim;++kk)
{
int mask=kk;
sel.clear();
for(int i=1;i<=k;++i)
{
if(mask%2) sel.push_back(i);
mask/=2;
}
if(sel.size()==1)
{
dp[sel[0]][kk]=dist[0][c[sel[0]]];
continue;
}
for(auto i:sel)
{
int elim=kk-(1<<i);
dp[i][kk]=inf;
for(auto j:sel)
if(j!=i) dp[i][kk]=min(dp[i][kk],dp[j][elim]+dist[j][c[i]]);
}
}
int ans=inf;
for(int i=1;i<=k;++i)
ans=min(ans,dp[i][lim]+dist[i][n]);
cout<<ans<<'\n';
return 0;
}