Pagini recente » Cod sursa (job #1191195) | Cod sursa (job #463100) | Cod sursa (job #2838141) | Cod sursa (job #2461733) | Cod sursa (job #1582900)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
vector<pair <int , int > > graf[2005];
priority_queue < pair < pair < int ,int > , int > > q;
int n,m,k,kuri[2005],dp[2005][65550];
void citire()
{
scanf("%d%d",&n,&m);
scanf("%d",&k);
for (int i=1; i<=k; ++i)
{
int x;
scanf("%d",&x);
kuri[x]=i;
}
for (int i=1; i<=m; ++i)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
graf[x].push_back(make_pair(y,c));
}
}
void dijkstra()
{
q.push(make_pair(make_pair(0,1),0));
memset(dp,inf,sizeof(dp));
while (!q.empty())
{
int nod=q.top().first.second;
int c=-q.top().first.first;
int ors=q.top().second;
q.pop();
for (vector <pair <int ,int > > :: iterator it=graf[nod].begin(); it!=graf[nod].end(); ++it)
{
if (kuri[it->first] && (ors & 1<<kuri[it->first]))
{
if (dp[it->first][ors] > c+it->second)
{
dp[it->first][ors]=c+it->second;
q.push(make_pair(make_pair(-(c+it->second),it->first),ors));
}
}
else if (kuri[it->first] && !(ors & 1<<kuri[it->first]))
{
if (dp[it->first][ors+1<<kuri[it->first]] > c+it->second)
{
dp[it->first][ors+1<<kuri[it->first]]=c+it->second;
q.push(make_pair(make_pair(-(c+it->second),it->first),ors+1<<kuri[it->first]));
}
}
else if (!kuri[it->first] && dp[it->first][ors] > c+it->second)
{
dp[it->first][ors]=c+it->second;
q.push(make_pair(make_pair(-(c+it->second),it->first),ors));
}
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
citire();
dijkstra();
printf("%d",dp[n][1<<k]);
return 0;
}