.弗洛伊德算法求最短路径

  1. 5. 弗洛伊德算法求最短路径

【问题描述】

对于下面一张若干个城市,以及城市之间距离的地图,请采用弗洛伊德算法求出所有城市之间的最短路径。

【输入形式】

顶点个数n,以及n*n的邻接矩阵,其中不可达使用9999表示。

【输出形式】

每两个顶点之间的最短路径和经过的顶点

注意:规定顶点自身到自身的dist值为0,此时path为该顶点编号。

【样例输入】

4

9999 4 11 9999

6 9999 2 9999

1 9999 9999 1

9999 3 9999 9999

【样例输出】

from(空格)0(空格)to(空格)0:(空格)dist(空格)=(空格)0(空格)path:0(换行)

from 0 to 1: dist = 4 path:0 1
from 0 to 2: dist = 6 path:0 1 2
from 0 to 3: dist = 7 path:0 1 2 3
from 1 to 0: dist = 3 path:1 2 0
from 1 to 1: dist = 0 path:1
from 1 to 2: dist = 2 path:1 2
from 1 to 3: dist = 3 path:1 2 3
from 2 to 0: dist = 1 path:2 0
from 2 to 1: dist = 4 path:2 3 1
from 2 to 2: dist = 0 path:2
from 2 to 3: dist = 1 path:2 3
from 3 to 0: dist = 6 path:3 1 2 0
from 3 to 1: dist = 3 path:3 1
from 3 to 2: dist = 5 path:3 1 2
from 3 to 3: dist = 0 path:3

#include <bits/stdc++.h>
using namespace std;
const int inf = 9999;
int arc[55][55];
int n;
int dist[55][55];
vector<int> path[55][55];
void creat()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            cin >> arc[i][j];
            if (i == j)
                arc[i][j] = 0;
        }
}
void floyed()
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            dist[i][j] = arc[i][j];
            if (dist[i][j] != inf && i != j)
            {
                path[i][j].push_back(i);
                path[i][j].push_back(j);
            }
            else if (i == j)
                path[i][j].push_back(i);
            else
                path[i][j].push_back(9999);
        }
    for (int k = 0; k < n; k++)
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (dist[i][j] > dist[i][k] + dist[k][j])
                {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    path[i][j].clear();
                    for (int q = 0; q < path[i][k].size() - 1; q++)
                    {
                        path[i][j].push_back(path[i][k][q]);
                    }
                    for (int q = 0; q < path[k][j].size(); q++)
                    {
                        path[i][j].push_back(path[k][j][q]);
                    }
                }
}
void show()
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
        {
            if (i == j)
            {
                dist[i][j] = 0;
                path[i][j].clear();
                path[i][j].push_back(i);
            }
            cout << "from " << i << " to " << j << ": "
                 << "dist = " << dist[i][j] << " path:";
            for (int k = 0; k < path[i][j].size(); k++)
            {
                cout << path[i][j][k] << " ";
            }
            cout << endl;
        }
}
int main()
{
    creat();
    floyed();
    show();
}

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
C语言中的弗洛伊德算法(Floyd-Warshall algorithm)是一种用于解图中所有节点之间最短路径算法。它可以处理有向图或无向图,但不能处理带有负权边的图。 该算法的基本思想是通过动态规划的方式逐步更新节点之间的最短路径算法的核心是一个二维数组,称为距离矩阵(distance matrix),用于存储任意两个节点之间的最短路径长度。 以下是C语言中弗洛伊德算法的基本实现步骤: 1. 初始化距离矩阵:将所有节点之间的距离初始化为无穷大(表示不可达),将自身到自身的距离初始化为0。 2. 遍历图中的每个边,更新距离矩阵:如果存在一条边 (u, v) 的权重为 w,且从节点 u 到节点 v 的距离大于从节点 u 经过节点 k 再到节点 v 的距离(即 distance[u][v] > distance[u][k] + distance[k][v]),则更新距离矩阵中的值为 distance[u][k] + distance[k][v]。 3. 重复步骤2,直到遍历完所有节点和边。 4. 最终得到的距离矩阵即为图中任意两个节点之间的最短路径长度。 下面是一个简单的C语言代码示例: ```c #include <stdio.h> #define INF 99999 #define V 4 void floydWarshall(int graph[V][V]) { int distance[V][V]; int i, j, k; // 初始化距离矩阵 for (i = 0; i < V; i++) { for (j = 0; j < V; j++) { distance[i][j] = graph[i][j]; } } // 更新距离矩阵 for (k = 0; k < V; k++) { for (i = 0; i < V; i++) { for (j = 0; j < V; j++) { if (distance[i][k] + distance[k][j] < distance[i][j]) { distance[i][j] = distance[i][k] + distance[k][j]; } } } } // 打印最短路径长度 for (i = 0; i < V; i++) { for (j = 0; j < V; j++) { if (distance[i][j] == INF) { printf("INF "); } else { printf("%d ", distance[i][j]); } } printf("\n"); } } int main() { int graph[V][V] = { {0, 5, INF, 10}, {INF, 0, 3, INF}, {INF, INF, 0, 1}, {INF, INF, INF, 0} }; floydWarshall(graph); return 0; } ``` 这段代码中,我们使用一个4x4的矩阵表示图的邻接矩阵,其中INF表示不可达的情况。运行代码后,将输出图中任意两个节点之间的最短路径长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wrong Ansewer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值