最短路径(啊哈!算法)

任意2个点直接的最短路径:

首先分析确定2个点之间的最短路径:

比如A到B,要缩短A到B的路径就需要引入一个中转点K,有时可能需要多个中转点。A->k1->k2->B

如果不允许引入中转点那么A到B的最短路径就是A->B

 

 

 

 插入1号城市,更新路径:

 

 

插入1,2城市,更新路径

 

 

求任意2点的最短路径就是求任意2点经过前K个点的最短路径

 

#include<iostream>
using namespace std;
int map[50][50];
int book[50];
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i == j){
				map[i][j]=0;
			}else{
				map[i][j]=999999;
			}
		}
	}
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		map[a][b]=c;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				if(map[j][i]+map[i][k] <map[j][k] ){
					map[j][k]=map[j][i]+map[i][k];
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(j!=n){
				cout<<map[i][j]<<' ';
			}else{
				cout<<map[i][j]<<endl;
			}
		}
	}
	return 0;
}

  

 

 时间复杂度O(N^3),Floyd算法不能解决负权回路问题

 

永远找不到最短路径

 

posted on 2020-04-08 15:42  二进制dd  阅读(373)  评论(0编辑  收藏  举报

导航