Floyd算法求最短路径

Floyd算法

Floyd 算法用来解决全源最短路径问题,即对给定的图 G(V,E) ,求任意两点 u v 之间的最短路径长度。
Floyd 算法基于这样一个事实:如果存在顶点 k ,使得以 k 作为中介点时顶点 i 和顶点 j 的当前最短距离缩短,则使用顶点 k 作为顶点 i 和顶点 j 的中介点,即当 dis[ i ][k]+dis[k][j]<dis[ i ][j] 时,令 dis[ i ][j]= dis[ i][k]+dis[k][j] (其 中dis[i ][j] 表示从顶点 i 到顶点 j 的最短距离)。

图:

 

运算结果 :

 

代码 :

#include<iostream>
#include<vector>
using namespace std;
const int INF=99999;
class Graph {
	public:
		int N,E;
		int type;
		vector<vector<int> > g;
		Graph(int n=0,int e=0,int type=0) {
			N=n;
			E=e;
			type=type;
			g=vector<vector<int> >(N+1,vector<int>(N+1,INF));
		}
		add(int v,int d,int w=1) {
			g[v][d]=w;
			if(type==1) {
				g[d][v]=w;
			}
		}
		print() {
			for(int i=1; i<=N; i++) {
				for(int j=1; j<=N; j++) {
					cout<<g[i][j]<<" ";
				}
				cout<<endl;
			}
		}

};

void floyd(Graph g) {
	for(int k=1; k<=g.N; k++) {//中介点
		for(int i=1; i<=g.N; i++) {//起点
			for(int j=1; j<=g.N; j++) {//终点
				if(g.g[i][k]+g.g[k][j]<g.g[i][j])
					g.g[i][j]=g.g[i][k]+g.g[k][j];
			}
		}
	}
	for(int i=1; i<=g.N; i++) {
		g.g[i][i]=0;
	}
	g.print();
}
int main(void) {
	Graph g(4,8,0);
	g.add(1,2,2);
	g.add(1,3,6);
	g.add(1,4,4);
	g.add(2,3,3);
	g.add(3,1,7);
	g.add(3,4,1);
	g.add(4,1,5);
	g.add(4,3,12);
	floyd(g);
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值