Pagini recente » Cod sursa (job #1616809) | Cod sursa (job #1371121) | Cod sursa (job #2425900) | Cod sursa (job #1578148) | Cod sursa (job #1618203)
#include <iostream>
#include <fstream>
#include <queue>
#define f first
#define s second
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct triple
{
int dist, node;
long long stare;
triple(int d, int n, int st)
{
dist=d;
node=n;
stare=st;
}
};
class cmp
{
public :
bool operator()(triple a, triple b)
{
if(a.dist!=b.dist)
return a.dist>b.dist;
if(a.node!=b.node)
return a.node<b.node;
return 0;
}
};
priority_queue < triple, vector<triple>,cmp >Q;
vector <pair<int, int> >G[2004];
//const int oo=(1<<18);
bool d[2004][(1<<15)+5];
int K[2004];
int n, k, m, i, c, x, y, z;
int dij()
{
Q.push(triple(0,1,0));
while(!Q.empty())
{
int node=Q.top().node;
int dist=Q.top().dist;
long long stare=Q.top().stare;
Q.pop();
if(node==n&&stare==(1<<k)-1)
return dist;
if(!d[node][stare])
{
d[node][stare]=1;
for(unsigned int i=0;i<G[node].size();i++)
{
if(K[G[node][i].f]>=0&&!(stare&(1<<K[G[node][i].f])))
{
long long stare2=stare+(1<<K[G[node][i].f]);
if(!d[G[node][i].f][stare2])
{
Q.push(triple(dist+G[node][i].s,G[node][i].f,stare2));
}
}
else
{
if(!d[G[node][i].f][stare])
{
Q.push(triple(dist+G[node][i].s,G[node][i].f,stare));
}
}
}
}
}
return -1;
}
int main()
{
fin>>n>>m;
fin>>k;
for(i=0;i<=n;i++)
K[i]=-1;
for(i=0;i<k;i++)
{
fin>>c;
K[c]=i;
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>z;
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
fout<<dij();
return 0;
}