Acwing_1137最佳线路【多起点最短路问题】

题目描述:
有一天,琪琪想乘坐公交车去拜访她的一位朋友。

由于琪琪非常容易晕车,所以她想尽快到达朋友家。

现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。

已知城市中共包含 n 个车站(编号1~n)以及 m 条公交线路。

每条公交线路都是 单向的,从一个车站出发直接到达另一个车站,两个车站之间可能存在多条公交线路。

琪琪的朋友住在 s 号车站附近。

琪琪可以在任何车站选择换乘其它公共汽车。

请找出琪琪到达她的朋友家(附近的公交车站)需要花费的最少时间。

输入格式:
输入包含多组测试数据。

每组测试数据第一行包含三个整数 n,m,s,分别表示车站数量,公交线路数量以及朋友家附近车站的编号。

接下来 m 行,每行包含三个整数 p,q,t,表示存在一条线路从车站 p 到达车站 q,用时为 t。

接下来一行,包含一个整数 w,表示琪琪家附近共有 w 个车站,她可以在这 w 个车站中选择一个车站作为始发站。

再一行,包含 w 个整数,表示琪琪家附近的 w 个车站的编号。

输出格式:
每个测试数据输出一个整数作为结果,表示所需花费的最少时间。

如果无法达到朋友家的车站,则输出 -1。

每个结果占一行。

数据范围:
n≤1000,m≤20000,
1≤s≤n,
0<w<n,
0<t≤1000
输入样例:

5 8 5
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1

输出样例:

1
-1

思路分析:

  • 这题有着多个起点,但是只有一个终点,所以这题可以反作图,求终点的单源最短路即可,但是不好扩展,所以这里用一个可以适用与多个起点和多个终点的最短路做法
  • 做法:创建一个虚拟原点,把这个原点和其他所有起点连一条边权为0的边,这样求这个虚拟原点的单源最短路,发现所有点到这个原点的最短路值是这个点到所有起点的最短路的值,所以这样就解决了多个起点和多个终点的最短路问题

AC代码:

//多起点最短路
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1010, M = 21010, INF = 0x3f3f3f3f;
int n, m, T;
int h[N], e[M], w[M], ne[M], idx;
int dist[N], q[N];
bool st[N];

void add(int a, int b, int c) {
	e[idx] = b;
	w[idx] = c;
	ne[idx] = h[a];
	h[a] = idx++;
}

int spfa()
{
	memset(dist, 0x3f, sizeof dist);

	dist[0] = 0;
	int hh = 0, tt = 1;
	q[0] = 0;//虚拟源点入队
	while (hh != tt) {
		int t = q[hh++];
		if (hh == N) hh = 0;
		st[t] = false;//出队标记为false
		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			if (dist[j] > dist[t] + w[i]) {
				dist[j] = dist[t] + w[i];
				if (!st[j]) {
					q[tt++] = j;
					if (tt == N) tt = 0;
					st[j] = true;
				}
			}
		}
	}
	if (dist[T] == INF) return -1;
	return dist[T];
}

int main()
{

	while (cin >> n >> m >> T) {
		idx = 0;
		memset(h, -1, sizeof h);
		while (m--) {
			int a, b, c;
			scanf("%d%d%d", &a, &b, &c);
			add(a, b, c);
		}
		int s;
		scanf("%d", &s);
		while (s--) {
			int ver;
			scanf("%d", &ver);
			add(0, ver, 0);
		}
		printf("%d\n", spfa());
	}

	system("pause");
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用networkx库来求解最短路径问题。其中,网络图G可以使用networkx.Graph()来创建。最短路径问题有两种求解方式:求每对顶点间的最短路和求固定起点到其余各点的最短路。 1. 求每对顶点间的最短路: 可以使用networkx库中的shortest_path函数来求解。该函数的参数包括:图G、起点source、终点target、权重weight和求解方法method。例如,可以使用shortest_path(G, source, target, weight, method)来求解每对顶点间的最短路径。 2. 求固定起点到其余各点的最短路: 可以使用Dijkstra算法来求解固定起点到其余各点的最短路径。在networkx库中,可以使用shortest_path_length函数来实现。该函数的参数与shortest_path函数类似,包括:图G、起点source、终点target、权重weight和求解方法method。例如,可以使用shortest_path_length(G, source, target, weight, method)来求解固定起点到其余各点的最短路径。 需要注意的是,要求最短路径问题前,需要加载networkx库,并创建网络图G。此外,还需要提供图的顶点信息、权重信息等参数,以便求解最短路径问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数学建模:图论模型 — 最短路问题的 Python 求解](https://blog.csdn.net/qq_55851911/article/details/124776077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值