您的位置:首页 > 其它

HDOJ 2066 一个人的旅行 (Dijkstra)

2017-08-04 22:49 435 查看
不难,就是求最短路,我最后用优先队列处理了~
#include <cstring>
#include <iostream>
#include <queue>
#define INF 0x3f3f3f3f
#define N 1010

using namespace std;
int map

, dis
;
int start
, vis
;
int dest
, maxcity;

void dijkstra(int s) {
int ans, mind;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= maxcity; i++) {
map[i][i] = 0;
dis[i] = map[s][i];
}

vis[s] = 1;
for (int i = 1; i < maxcity; i++) {
mind = INF;
for (int j = 1; j <= maxcity; j++) {
if (!vis[j] && dis[j] < mind) {
mind = dis[j];
ans = j;
}
}

vis[ans] = 1;

for (int j = 1; j <= maxcity; j++) {
if (!vis[j] && dis[ans] + map[ans][j] < dis[j])
dis[j] = dis[ans] + map[ans][j];
}
}
}

int main(void) {
int T, S, D, p1, p2, r, temp;
priority_queue<int, vector<int>, greater<int>> Q;
while (~scanf("%d%d%d", &T, &S, &D)) {
while (!Q.empty())
Q.pop();

maxcity = 0;
memset(map, INF, sizeof(map));
for (int i = 1; i <= T; i++) {
scanf("%d%d%d", &p1, &p2, &r);
if (map[p1][p2] > r) {
map[p1][p2] = r;
map[p2][p1] = r;
}
temp = p1 > p2 ? p1 : p2;
maxcity = temp > maxcity ? temp : maxcity;
}

for (int i = 1; i <= S; i++)
scanf("%d", &start[i]);

for (int i = 1; i <= D; i++)
scanf("%d", &dest[i]);

for (int i = 1; i <= S; i++) {
dijkstra(start[i]);
for (int j = 1; j <= D; j++)
Q.push(dis[dest[j]]);
}

printf("%d\n", Q.top());
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: