Pagini recente » Cod sursa (job #2592578) | Cod sursa (job #227636) | Cod sursa (job #955004) | Cod sursa (job #2222961) | Cod sursa (job #2853470)
#include <fstream>
#include <queue>
using namespace std;
ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");
int n, m, k, d[2001], viz[2001], f[2001];
int const INF = 100001;
struct liste_de_adiacenta{
int s[2001], c[2001];
}a[2001];
priority_queue <pair<int, int>> q;
bool oras(int c)
{
for (int i = 1; i<=k; i++)
{
if (f[i] == c)
return true;
}
return false;
}
void dijkstra (int nod)
{
bool p;
for (int i = 1; i<=n; i++)
{
d[i] = INF;
}
viz[nod] = 1;
d[nod] = 0;
q.push({0, nod});
while (!q.empty())
{
int x = q.top().second;
viz[x] = 1;
p = false;
q.pop();
// if (oras(x))
// {
// cout<<
// }
for (int i = 1; i<= a[x].s[0] && !p; i++)
{
int y = a[x].s[i];
int cost = a[x].c[i];
if (d[y] > d[x] + cost)
{
d[y] = d[x] + cost;
}
if (!viz[y])
{
if (oras(y))
{
while (!q.empty())
q.pop();
for (int i = 1; i<=n; i++)
{
viz[i] = 0;
if (i != y)
d[i] = INF;
}
p = true;
}
q.push({-d[y], y});
}
}
}
}
int main()
{
cin>>n>>m>>k;
for (int i = 1; i<=k; i++)
{
cin>>f[i];
}
for (int i = 1; i<=m; i++)
{
int x, y, cost;
cin>>x>>y>>cost;
a[x].s[++a[x].s[0]] = y;
a[x].c[a[x].s[0]] = cost;
a[y].s[++a[y].s[0]] = x;
a[y].c[a[y].s[0]] = cost;
}
dijkstra(1);
cout<<d[n];
return 0;
}