#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
#define MAXN 1010
#define INF 0x3fffffff
int map[MAXN][MAXN];
int dis[MAXN];
bool hash[MAXN];
struct Dij
{
int id;
int dis;
bool friend operator < (const Dij a, const Dij b)
{
return a.dis > b.dis;
}
};
Dij now, next;
void Init()
{
for (int i = 0; i < MAXN; i++)
{
map[i][i] = 0;
dis[i] = INF;
for (int j = i + 1; j < MAXN; j++)
{
map[i][j] = map[j][i] = INF;
}
}
}
int Bfs(int n)
{
priority_queue<Dij> Q;
now.id = 0;
now.dis = 0;
dis[0] = 0;
Q.push(now);
memset(hash, false, sizeof(hash));
while (!Q.empty())
{
now = Q.top();
Q.pop();
if (hash[now.id])
{
continue;
}
if (now.id == n)
{
return now.dis;
}
hash[now.id] = true;
for (int j = 0; j <= n; j++)
{
if (!hash[j] && dis[now.id] + map[now.id][j] < dis[j])
{
dis[j] = dis[now.id] + map[now.id][j];
next.id = j;
next.dis = dis[j];
Q.push(next);
}
}
}
}
int main()
{
int t, s, d, a, b, c, max, ans, i, ss, dd;
while (scanf("%d %d %d", &t, &s, &d) != EOF)
{
Init();
int max = 0;
for (i = 0; i < t; i++)
{
scanf("%d %d %d", &a, &b, &c);
if (c < map[a][b])
{
map[a][b] = map[b][a] = c;
}
if (a > max)
max = a;
if (b > max)
max = b;
}
while (s--)
{
scanf("%d", &ss);
map[0][ss] = map[ss][0] = 0;
}
while (d--)
{
scanf("%d", &dd);
map[dd][max + 1] = map[max + 1][dd] = 0;
}
ans = Bfs(max + 1);
printf("%d\n", ans);
}
return 0;
}
hdu2066最短路+最优队列
最新推荐文章于 2022-02-25 19:38:17 发布