dijkstra算法 单源最短路径

Dijkstra算法

给定图 G 和起点 s ,通过算法得到 S 到达其他每个顶点的最短距离。
基本思想:

    对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合V中选择与起点s的最短距离最小的一个顶点(记为U),访问并加入集合S。之后,另顶点U为中介点,优化起点S与所有从U能到达的顶点V之间的最短距离(就是找到与U相连的顶点K,通过dis[U]计算出他们与顶点的距离dis[K])。这样的操作执行n次(n为顶点个数),直到集合S已包含所有顶点 

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

int dijkstra(int v,int d,Graph g){
	const int INF=99999;
	int vis[g.N+1]={0};
	int dis[g.N+1];
	int pre[g.N+1]={0};
	fill(dis,dis+g.N+1,INF);
	dis[v]=0;
	for(int i=1;i<=g.N;i++){//循环遍历每个点
		int v=-1;
		int MIN=INF;
		for(int j=1;j<=g.N;j++){//找出未访问的距离顶点最近的点v
			if(vis[j]==0 && dis[j]<MIN){
				v=j;
				MIN=dis[j];
			}
		}
		vis[v]=1;
		for(int j=1;j<=g.N;j++){//找出与v相连的点,优化其与顶点的距离
			int len=g.g[v][j];//边长
			if(len>0 && len+dis[v]<dis[j]){
				dis[j]=len+dis[v];//更新最短距离
				pre[j]=v;//更新前置点
			}
		}
	}
	for(int i=1;i<=g.N;i++){
		cout<<dis[i]<<" ";
	}
}
int main(void) {
	Graph g(7,12,1);
	g.add(1,2,12);
	g.add(1,7,16);
	g.add(1,6,14);
	g.add(2,7,7);
	g.add(2,3,10);
	g.add(3,7,6);
	g.add(3,4,3);
	g.add(3,5,5);
	g.add(4,5,4);
	g.add(5,7,2);
	g.add(5,6,8);
	g.add(6,7,9);
	g.print();
	dijkstra(4,7,g);
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值