实验内容:(场景:穷游坐火车)
虽然我们班的小哼是个路痴,但他仍然盲目的相信自己能够去很多地方旅行。他想去北岳恒山看肖峰跳崖的地方,也想去九寨沟看看被神雕侠侣剧组毁掉的景点,去北京看海(长城人山人海),去上海找mm,……眼看着寒假就要来了,他决定要在最短的时间去几个想去的地方。而且他不是土豪,只能坐火车,去不了白云机场坐灰机。但是,我们学校在山沟里,有几个通往临近城市的高铁、火车站的坐车方法,但这需要点时间。请帮他算出他去到想去的地方的最短时间。
输入
程序启动后,依次输入信息如下:
1、第一行,输入3个整数T,S,D,表示有T条路,和去往临近城市高铁站、火车站的方法有S个,小哼想去的地方有D个
2、第二行开始(有T行),每行输入3个整数a,b,time:表示a,b城市之间的车程是time小时
3、第T+1行,输入S个整数,表示和我们学校相连的临近城市是哪些
4、第T+2行,输入D个整数,表示小哼想去地方是哪些
输出
程序依次output的信息如下:
1、第一行,输出D个整数,分别表示小哼想去的每个城市的最短时间(小哼无法到达的城市,用时为99999999,表示无穷时间)
(整数间用一个空格隔开,末尾没有空格)
输入样例 1
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
输出样例 1
9 19 21
输入样例 2
9 3 3
1 5 5
1 4 7
2 8 12
3 6 4
4 7 12
5 7 2
7 9 10
9 11 4
8 10 6
4 3 5
8 9 11
输出样例 2
99999999 12 16
提示
使用Dijkstra最短路径算法完成
一次Dijkstra就可解决,我们学校看为0,从学校到相邻城市花费看做0,我们只需求学校到各个目的地的最短路即可,Dijkstra便可解决。
代码如下:
#include<stdio.h>
#include<iostream>
using namespace std;
const int maxsize = 20;
typedef struct gra *graph;
struct gra {
int data[maxsize][maxsize];
int t, s, d;
};
int book[maxsize] = { 0 }, dis[maxsize], goal[maxsize];
void init(graph g) {
cin >> g->t >> g->s >> g->d;
int a, b, time;
for (int i = 0; i < maxsize; i++) {
for (int x = 0; x < maxsize; x++) {
if (i == x)
g->data[i][x] = 0;
else
g->data[i][x] = 99999999;
}
}
for (int i = 1; i <= g->t; i++) {
cin >> a >> b >> time;
g->data[a][b] = time;
}
for (int i = 0; i < g->s; i++) {
int city;
cin >> city;
g->data[0][city] = 0;
}
for (int i = 0; i < g->d; i++) {
cin >> goal[i];
}
for (int i = 0; i < maxsize; i++) {
dis[i] = g->data[0][i];
}
for (int i = 0; i < maxsize; i++) {
book[i] = 0;
}
book[0] = 1;
}
void display(graph g) {
for (int i = 0; i < maxsize; i++) {
for (int x = 0; x < maxsize; x++) {
printf("%d", g->data[i][x]);
if (x != 11) {
printf(" ");
}
}
printf("\n");
}
}
int main() {
graph g = new gra;
int min = 999,u;
init(g);
for (int i = 1; i < maxsize -1; i++) {
min = 999;
for (int j = 1; j < maxsize; j++) {
if (book[j] == 0 && dis[j] < min) {
min = dis[j];
u = j;
}
}
book[u] = 1;
for (int v = 1; v < maxsize; v++) {
if (g->data[u][v] < 999) {
if (dis[v] > dis[u] + g->data[u][v]) {
dis[v] = dis[u] + g->data[u][v];
}
}
}
}
for (int i = 0; i < g->d; i++) {
printf("%d", dis[goal[i]]);
if (i != g->d - 1) {
printf(" ");
}
}
return 0;
}