首页 > 编程语言 >最短路径问题——Floyd算法,dijkstra算法

最短路径问题——Floyd算法,dijkstra算法

时间:2024-06-16 11:34:12浏览次数:24  
标签:int 路径 dijkstra 整数 算法 Floyd 顶点

7-16 最短路径算法(Floyd-Warshall)

在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题。

解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O(n3)。
而另一种算法是由弗洛伊德提出的,时间复杂度同样是O(n3),但算法的形式简单很多。

在本题中,读入一个有向图的带权邻接矩阵(即数组表示),建立有向图并使用Floyd算法求出每一对顶点间的最短路径长度。

输入格式:

输入的第一行包含1个正整数n,表示图中共有n个顶点。其中n不超过50。

以后的n行中每行有n个用空格隔开的整数。对于第i行的第j个整数,如果大于0,则表示第i个顶点有指向第j个顶点的有向边,且权值为对应的整数值;如果这个整数为0,则表示没有i指向j的有向边。
当i和j相等的时候,保证对应的整数为0。

输出格式:

共有n行,每行有n个整数,表示源点至每一个顶点的最短路径长度。

如果不存在从源点至相应顶点的路径,输出-1。对于某个顶点到其本身的最短路径长度,输出0。

请在每个整数后输出一个空格,并请注意行尾输出换行。

输入样例:

4
0 3 0 1
0 0 4 0
2 0 0 0
0 0 1 0

输出样例:

0 3 2 1 
6 0 4 7 
2 5 0 3 
3 6 1 0 
/*
这个代码相比于原理更加简化了一些,原理中使用了俩个矩阵,
一个用来存两个点之间最短的路径长度(a),另一个用来存一个点到另一个点之间的中转点(path)

*/
#include<iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
int n;
int a[51][51];
void Floyd() {
	for (int k = 1; k <= n; k++) {  //k是中转点
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (a[i][k] < INF && a[k][j] < INF) {
					a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
                    //path[i][j]=k;
				}
			}
		}
	}
}
int main() {
	cin >> n;
	memset(a, INF, sizeof(a));
	for (int i = 1; i <= n; i++) {
		a[i][i] = 0;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int x; cin >> x;
			if (x != 0 || i == j) {
				a[i][j] = x;
			}
		}
	}
	Floyd();
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (a[i][j] == INF) cout << -1 << " ";
			else cout << a[i][j] << " ";
		}
		cout << endl;
	}
}

 

标签:int,路径,dijkstra,整数,算法,Floyd,顶点
From: https://www.cnblogs.com/sly-345/p/18250357

相关文章

  • 决策树算法:揭示数据背后的决策逻辑
    目录一决策树算法原理特征选择信息增益信息增益比基尼指数树的构建树的剪枝预剪枝后剪枝二决策树算法实现一使用决策树进行分类数据预处理构建决策树模型二使用决策树进行回归数据预处理构建决策树回归模型三决策树算法的优缺点优点缺点四决策树的改......
  • dijkstra 复杂度证明
    我们用以下代码为例分析复杂度#include<bits/stdc++.h>#include<climits>#definefirfirst#definesesecondusingnamespacestd;typedeflonglongll;typedefpair<ll,int>PII;inlineintread(){ intx=0,f=1;charc=getchar(); while(c<'0......
  • K-均值聚类算法:原理、应用及实战代码示例
    摘要K-均值聚类算法是数据科学中的一个基础而强大的工具,用于将数据点分组成不同的簇。本文不仅介绍了K-均值聚类算法的基本原理和优缺点,还提供了Python代码示例,展示如何在实际数据集上应用这一算法。关键词K-均值聚类,无监督学习,Python,数据挖掘目录引言K-均值聚类算法原理......
  • 算法02 递归算法及其相关问题【C++实现】
    递归在编程中,我们把函数直接或者间接调用自身的过程叫做递归。递归处理问题的过程是:通常把一个大型的复杂问题,转变成一个与原问题类似的,规模更小的问题来进行求解。递归的三大要素函数的参数。在用递归解决问题时,要合理地去设计函数的参数,达到当前问题与子问题之间的变化,可......
  • 程序员必须掌握的算法:编程之路的基石
    作为一名程序员,我深知算法在编程中的重要性。算法不仅是编程的基础,更是我们解决问题、优化程序的关键。下面,我将介绍一些程序员在编程中需要掌握的基本算法,并强调算法在编程中的重要性,同时提供一些实用的算法学习资源。基本算法介绍与实现1.快速排序(QuickSort)快速排序......
  • 程序设计与算法(三)C++:第五章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge019:全面的MyString这个题也是有很多的成员函数,我们来从主函数分析一下:MyStrings1("abcd-"),s2,s3("efgh-"),s4(s1);//无参构造,有参构造,复制可以不写 MyStringSArray[4]={"big","me","about","take"......
  • 算法金 | 选择最佳机器学习模型的 10 步指南
    大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]机器学习和数据科学领域的工作充满挑战和乐趣,在我踏上人工智能探索之路的初期,我对能够参与项目感到无比兴奋。我满怀热情,我急切地想投身于这些项目中。但是,我尝试开展项目,却发现......
  • GB | 华中农大焦文标团队开发适用于植物基因组的基于图形的集成式分型算法
    今年4月,华中农业大学焦文标团队在GenomeBiology上发表论文:Acomprehensivebenchmarkofgraph‑basedgeneticvariantgenotypingalgorithmsonplantgenomesforcreatinganaccurateensemblepipeline,主要研究了基于图谱的植物基因组变异基因分型算法,并创建了一个准确的......
  • 代码随想录 算法训练营 day10 leetcode232 用栈实现队列 Leetcode225 用队列实现栈 Le
    Leetcode232用栈实现队列题目链接讲解用两个栈实现队列每次需要出队列或者查看队头元素时,将输入栈的所有元素放到输出栈classMyQueue{Stack<Integer>stackIn;Stack<Integer>stackOut;publicMyQueue(){stackIn=newStack<>();//负责进......
  • 用python写一个企业知识库算法
    企业知识库算法是一个用于管理和检索企业内部知识的系统。在这个例子中,我们将使用Python编写一个简单的企业知识库算法,该算法将实现以下功能:1.添加知识条目2.搜索知识条目我们将使用一个字典来存储知识库中的知识条目。每个知识条目都是一个字典,包含以下字段:-id:知识条......