图-最短路径算法(Dijkstra)

实验内容:(场景:穷游坐火车)

虽然我们班的小哼是个路痴,但他仍然盲目的相信自己能够去很多地方旅行。他想去北岳恒山看肖峰跳崖的地方,也想去九寨沟看看被神雕侠侣剧组毁掉的景点,去北京看海(长城人山人海),去上海找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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值