无向无权图的最短路径数

该博客介绍了如何解决无向无权图中计算1到n的最短路径数目的问题。通过BFS算法,可以有效地找到所有不同的最短路径。示例展示了输入和输出格式,并给出了数据范围以及来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

  给出 n 个顶点(编号为1..n),m 条边的无向无权图,请计算 1 到 n 的最短路径数目(只要有一条边不同,就是两条不同的路径)。

【输入格式】

  第一行包含两个整数:n,m,表示图的顶点和边的数目。
  接下来的m行,每行包含2个整数:a,b((1 ≤ a, b ≤ n),表示图的一条边关联的顶点为a,b。

【输出格式】

  一个整数,表示 1 到 n 的最短路径数目。

【输入样例】

6 9
1 2
1 3
1 4
2 5
2 6
2 3
3 6
4 6
3 5

【输出样例】

3

【数据范围】

n<=50000 , 1<=m<=100000 

【来源】

Mr_He原创。

此题是个经典题目,代表了一个经典的算法:使用BFS求无相无权图的最短路径数。
代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
<
下面是使用Dijkstra算法求解无向带权图最短路径的C语言代码实现,其中采用了邻接矩阵来表示图: ```c #include <stdio.h> #include <limits.h> #define V 5 // 图的顶点 // 找到距离组中最小距离对应的顶点 int min_distance(int dist[], int visited[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) { if (!visited[v] && dist[v] < min) { min = dist[v]; min_index = v; } } return min_index; } // 使用Dijkstra算法求解最短路径 void dijkstra(int graph[V][V], int start) { int dist[V], visited[V]; // 初始化距离组和访问组 for (int v = 0; v < V; v++) { dist[v] = INT_MAX; visited[v] = 0; } dist[start] = 0; // 遍历所有顶点 for (int count = 0; count < V - 1; count++) { // 找到距离组中最小距离对应的顶点 int u = min_distance(dist, visited); // 将该顶点标记为已访问 visited[u] = 1; // 更新所有未访问的相邻顶点的距离 for (int v = 0; v < V; v++) { if (!visited[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } // 输出最短距离 printf("最短距离:\n"); for (int i = 0; i < V; i++) { printf("%d\t", dist[i]); } printf("\n"); } // 测试代码 int main() { // 定义图的邻接矩阵 int graph[V][V] = { {0, 2, 0, 1, 0}, {2, 0, 3, 2, 0}, {0, 3, 0, 1, 4}, {1, 2, 1, 0, 3}, {0, 0, 4, 3, 0} }; // 求解最短路径 dijkstra(graph, 0); return 0; } ``` 在上述代码中,我们首先定义了图的邻接矩阵,然后实现了`min_distance()`函来找到距离组中最小距离对应的顶点。接着,我们使用Dijkstra算法求解最短路径,首先初始化距离组和访问组,将起始顶点的距离设为0。然后,我们遍历所有顶点,每次找到距离组中最小距离对应的顶点,并将该顶点标记为已访问。接着,我们更新所有未访问的相邻顶点的距离。最后,输出最短距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值