Pagini recente » Cod sursa (job #235532) | Autentificare | Istoria paginii runda/nostress8/clasament | Istoria paginii runda/eusebiu_oji_2011_cls11-12/clasament | Cod sursa (job #3141489)
#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];
int e[2001],c[16],n,k,m,x,y,cost,vecin,i,j,minim,l,nr,dp[16][2001],d[16][32769];
void f (int nod,int d[])
{
for (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 (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 (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 (j=1; j<=(1<<(k-1)); j++)
{
for (i=1; i<=k; i++)
{
if (((j>>(i-1))&1)==0)
continue;
for (l=1; l<=k; l++)
{
if (j>>(l-1)&1)
continue;
nr=j+(1<<(l-1));
d[l][nr]=min (d[l][nr],d[i][j]+dp[i][c[l]]);
}
}
}
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;
}