Pagini recente » Cod sursa (job #303471) | Cod sursa (job #75639) | Cod sursa (job #1041451) | Cod sursa (job #1371700) | Cod sursa (job #583513)
Cod sursa(job #583513)
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>
#include<bitset>
#define DIM 2005
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
vector <pair<int ,int> > lst[DIM];
int d[20][DIM],a[20],n,k,akm,b[1<<18][20],sol;
bitset <DIM> v;
struct cmp
{
bool operator () (const int &a,const int &b) const
{
return d[akm][a]>d[akm][b];
}
}; priority_queue <int, vector<int>, cmp> h;
inline void dijkstra ()
{
int nr,i;
v.reset ();
for(i=1;i<=n;++i)
d[akm][i]=1<<30;
d[akm][a[akm]]=0;
h.push (a[akm]);
while(!h.empty ())
{
nr=h.top ();
v[nr]=0;
h.pop ();
for(i=0;i<lst[nr].size ();++i)
if(d[akm][nr]+lst[nr][i].sc<d[akm][lst[nr][i].fs])
{
d[akm][lst[nr][i].fs]=d[akm][nr]+lst[nr][i].sc;
if(v[lst[nr][i].fs]==0)
{
v[lst[nr][i].fs]=1;
h.push (lst[nr][i].fs);
}
}
}
}
int main ()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
int i,j,p,nr1,nr2,nr3,m;
scanf("%d%d%d",&n,&m,&k);
a[0]=1;
for(i=1;i<=k;++i)
scanf("%d",&a[i]);
a[k+1]=n;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&nr1,&nr2,&nr3);
lst[nr1].pb (mp (nr2,nr3));
lst[nr2].pb (mp (nr1,nr3));
}
for(i=0;i<=k+1;++i)
{
akm=i;
dijkstra ();
}
if(k==0)
{
printf("%d\n",d[1][1]);
return 0;
}
for(i=1;i<(1<<k);++i)
for(j=1;j<=k;++j)
b[i][j]=1<<30;
for(i=1;i<=k;++i)
b[1<<(i-1)][i]=d[0][a[i]];
for(i=1;i<(1<<k);++i)
for(j=1;j<=k;++j)
if((i|(1<<(j-1)))==i)
for(p=1;p<=k;++p)
if((i|(1<<(p-1)))!=i)
b[i|(1<<(p-1))][p]=min(b[i|(1<<(p-1))][p],b[i][j]+d[j][a[p]]);
sol=1<<30;
for(i=1;i<=k;++i)
sol=min(sol,b[(1<<k)-1][i]+d[k+1][a[i]]);
printf("%d\n",sol);
return 0;
}