Pagini recente » Cod sursa (job #240723) | Cod sursa (job #2429778) | Cod sursa (job #77588) | Cod sursa (job #497513) | Cod sursa (job #3307274)
#include "bits/stdc++.h"
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
long long d[2002][2002],l[20],dp[33000][20];
int main ()
{
long long n,m,k,x,i,j,c,y,a1,a2,min1,mask,a;
set <pair<long long,int>> s;
vector <pair<int,int>> v[2002];
f>>n>>m>>k;
k++;
l[1]=1;
for (x=2;x<=k;x++)
{
f>>l[x];
}
k++;
l[k]=n;
for (x=1;x<=m;x++)
{
f>>i>>j>>c;
v[i].push_back ({j,c});
v[j].push_back ({i,c});
}
for (x=1;x<=k;x++)
{
for (y=1;y<=n;y++)
d[l[x]][y]=0x3f3f3f3f;
d[l[x]][l[x]]=0;
s.insert ({0,l[x]});
while (s.size ()!=0)
{
a1=s.begin()->first;
a2=s.begin()->second;
s.erase(s.begin());
for (auto a : v[a2])
{
j=a.first;
c=a.second;
if (d[l[x]][j]>d[l[x]][a2]+c)
{
if (d[l[x]][j]!=0x3f3f3f3f)
{
s.erase ({d[l[x]][j],j});
}
d[l[x]][j]=d[l[x]][a2]+c;
s.insert ({d[l[x]][j],j});
}
}
}
for (y=1;y<=n;y++)
{
if (d[l[x]][y]==0x3f3f3f3f) d[l[x]][y]=0;
}
}
for (mask=1;mask<a1;mask++)
{
for (x=2;x<k;x++)
{
dp[mask][x]=0x3f3f3f3f;
}
}
a1=1<<(k-2);
for (mask=1;mask<a1;mask++)
{
for (x=2;x<k;x++)
{
a=1<<(x-2);
if (mask&a)
{
if (mask-a==0)
{
if (d[1][l[x]]!=0)
{
dp[mask][x]=d[1][l[x]];
}
}
else
{
for (y=2;y<k;y++)
{
a2=1<<(x-2);
if (mask&a2)
{
dp[mask][x]=min(dp[mask][x],dp[mask-a][y]+d[l[y]][l[x]]);
}
}
}
}
}
}
min1=0x3f3f3f3f;mask=1<<(k-2);
for (x=2;x<k;x++)
{
if (d[l[x]][n]!=0)
min1=min(min1,dp[mask-1][x]+d[l[x]][n]);
}
g<<min1;
f.close ();
g.close ();
return 0;
}