Pagini recente » Cod sursa (job #1577177) | Cod sursa (job #1784897) | Cod sursa (job #1081532) | Cod sursa (job #3126529) | Cod sursa (job #1904696)
#include <cstdio>
#include <vector>
#include <queue>
#define PII pair <int, int>
using namespace std;
const int KMAX=15;
const int NMAX=200;
const int inf=2e9;
int n,m,k,i;
int ind[NMAX+5],D[NMAX+5][(1<<KMAX)+5];
bool town[NMAX+5],ok[NMAX+5][(1<<KMAX)+5];
vector < PII > G[NMAX+5];
queue < PII > q;
void bellman()
{
int i,j,node,mask,s,son,cost,mask2;
for(i=1; i<=n; ++i)
for(j=0; j<(1<<k); ++j)
D[i][j]=inf;
q.push(make_pair(1,0));
D[1][0]=0;
while(!q.empty())
{
node=q.front().first;
mask=q.front().second;
q.pop();
ok[node][mask]=0;
s=G[node].size();
for(i=0; i<s; ++i)
{
son=G[node][i].first;
cost=G[node][i].second;
mask2=mask;
if(town[son])
mask2|=1<<(ind[son]-1);
if(D[node][mask]+cost<D[son][mask2])
{
if(!ok[son][mask2])
q.push(make_pair(son,mask2));
D[son][mask2]=D[node][mask]+cost;
ok[son][mask2]=1;
}
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=k; ++i)
{
int x;
scanf("%d",&x);
town[x]=1;
ind[x]=i;
}
for(i=1; i<=m; ++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
bellman();
printf("%d\n",D[n][(1<<k)-1]);
return 0;
}