Pagini recente » Cod sursa (job #214102) | Cod sursa (job #2704601) | Cod sursa (job #467628) | Cod sursa (job #1379493) | Cod sursa (job #2498437)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
int n,m;
int k;
struct edge
{
int d,c;
};
struct elem
{
int in,c;
};
struct Comp: binary_function<elem,elem,bool>
{
bool operator() (elem e1, elem e2)
{
return e1.c<e2.c;
}
};
vector<edge> v[2500];
int t[2500];
int ct[2500];
int ct2[15][2500];
int d[15][(1<<15)];
priority_queue<elem,vector<elem>,Comp> pq;
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d %d",&n,&m);
scanf("%d",&k);
for(int i=0;i<k;i++)
scanf("%d",&t[i]);
while(m--)
{
int j,k,c;
scanf("%d %d %d",&j,&k,&c);
v[j].push_back({k,c});
v[k].push_back({j,c});
}
for(int i=0;i<=n;i++)
ct[i]=INT_MAX;
ct[1]=0;
pq.push({1,0});
while(!pq.empty())
{
elem tp =pq.top();
pq.pop();
if(tp.c>ct[tp.in]) continue;
for(int i=0;i<v[tp.in].size();i++)
{
edge e = v[tp.in][i];
if(ct[e.d]>=tp.c+e.c)
{
ct[e.d]=tp.c+e.c;
pq.push({e.d,tp.c+e.c});
}
}
}
for(int i=0;i<k;i++)
{
for(int j=0;j<=n;j++)
ct2[i][j]=INT_MAX;
ct2[i][t[i]]=0;
pq.push({t[i],0});
while(!pq.empty())
{
elem tp =pq.top();
pq.pop();
if(tp.c>ct2[i][tp.in]) continue;
for(int j=0;j<v[tp.in].size();j++)
{
edge e = v[tp.in][j];
if(ct2[i][e.d]>=tp.c+e.c)
{
ct2[i][e.d]=tp.c+e.c;
pq.push({e.d,tp.c+e.c});
}
}
}
}
for(int i=0;i<(1<<k);i++)
for(int j=0;j<k;j++)
d[j][i]=INT_MAX;
for(int i=0;i<k;i++)
{
int p = t[i];
d[i][1<<i]=ct[p];
}
for(int i=0;i<(1<<k)-1;i++)
for(int p=0;p<k;p++)
{
if((i&(1<<p))==0) continue;
for(int j=0;j<k;j++)
{
int tj= t[j];
if((i&(1<<j))==0)
d[j][i|(1<<j)]=min(d[j][i|(1<<j)],d[p][i]+ct2[p][tj]);
}
}
int minn=INT_MAX;
for(int i=0;i<k;i++)
minn=min(minn,d[i][(1<<k)-1]+ct2[i][n]);
if(k==0)
minn= ct[n];
printf("%d",minn);
}