Pagini recente » Cod sursa (job #2790245) | Cod sursa (job #2160158) | Cod sursa (job #2758847) | Cod sursa (job #1126297) | Cod sursa (job #3141516)
#include <fstream>
#include <set>
#include <vector>
#define inf 100000000
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");
set <pair <int,int>> s;
vector <pair <int,int>> v[2001];
long long e[2001],c[16],n,k,m,x,y,cost,vecin,i,j,minim,l,nr,dp[16][2001],d[32769][16];
void f (long long nod,long long d[])
{
for (int i=1; i<=n; i++)
d[i]=inf;
d[nod]=0;
s.insert (make_pair(0,nod));
while (!s.empty ())
{
nod=s.begin ()->second;
s.erase (s.begin ());
for (int i=0; i<v[nod].size (); i++)
{
vecin=v[nod][i].first;
cost=v[nod][i].second;
if (d[vecin]>d[nod]+cost)
{
s.erase (make_pair (d[vecin],vecin));
d[vecin]=d[nod]+cost;
s.insert (make_pair (d[vecin],vecin));
}
}
}
}
int main ()
{
fin>>n>>m>>k;
for (i=1; i<=k; i++)
fin>>c[i];
for (i=1; i<=m; i++)
{
fin>>x>>y>>cost;
v[x].push_back (make_pair (y,cost));
v[y].push_back (make_pair (x,cost));
}
for (j=1; j<=(1<<k)-1; j++)
{
for (i=1; i<=k; i++)
d[j][i]=inf;
}
for (i=1; i<=k; i++)
f (c[i],dp[i]);
f (1,e);
for (i=1; i<=k; i++)
d[(1<<(i-1))][i]=e[c[i]];
for (i=1; i<=(1<<k)-1; i++)
{
for (j=1; j<=k; j++)
{
if (((i>>(j-1))&1)==0||i-(1<<(j-1))==0)
continue;
for (l=1; l<=k; l++)
{
if (l==j||((i>>(l-1))&1)==0)
continue;
nr=i-(1<<(j-1));
d[i][j]=min (d[i][l],d[nr][l]+dp[l][c[j]]);
}
}
}
minim=inf;
for (i=1; i<=k; i++)
{
if (d[(1<<k)-1][i]+dp[i][n]<minim)
minim=d[(1<<k)-1][i]+dp[i][n];
}
fout<<minim;
return 0;
}