1.给定一张类二分图建图过程: 首先有两个集合A和B,两个集合都有n个点,编号都是从1到n。 A集合中,第i号点()向第i+1号点连一条权值为y的无向边。 B集合中,第i号点()向第i+1号点连一条权值为y的无向边。 A集合第i号点()向B集合第i号点连一条权值为x的无向边。 B集合第i号点()向A集合第i+1号点连一条权值为x的无向边。 现在给定A集合编号为a的点和B集合编号为b的点,求a到b的最短距离。请编写程序,对以下4组数据分别进行求解,并把程序和求解结果放在答卷中。 (1) n=100, x=2,y=5, a=1, b=12 (2) n=1000, x=332,y=590, a=181, b=457 (3) n=1000000, x=391, y=879, a=44324, b=22503 (4) n=100000000, x=1010203, y=2033161, a=18697, b=2160
时间: 2024-03-31 08:35:55 浏览: 84
这道题可以使用最短路算法来解决。由于图是无向图且边权都是正数,可以使用Dijkstra算法求解最短路。不过由于点的个数较多,我们需要使用堆优化的Dijkstra算法来进行求解。
具体做法如下:
1. 建立一个大小为n*2的二维数组G,表示图的邻接矩阵,其中G[i][j]表示第i个点和第j个点之间的权值(如果不存在该边,则权值为无穷大)。
2. 建立一个大小为n*2的数组dist,表示源点到每个点的最短距离,初始时所有的dist[i]都为无穷大,除了dist[a]为0。
3. 建立一个大小为n*2的数组visited,表示每个点是否已经被访问过,初始时所有的visited[i]都为false。
4. 将源点a加入一个最小堆中,堆中元素的比较方式是按照dist的大小进行比较。
5. 从堆中取出dist最小的点u,将u标记为已访问,然后遍历u的所有邻居v,如果v未被访问过且从u到v的距离比目前记录的dist[v]更小,则更新dist[v]的值,并将v加入堆中。
6. 重复步骤5,直到堆为空或者堆中的点都已经被访问过。
7. 最终dist[b]的值就是源点a到目标点b的最短距离。
下面是Python3的实现代码:
阅读全文