朴素版的DijkstraO(n^2)求最短路(正权值)

n是点 m是边的个数

朴素版的 Dijkstra求最短路问题(都是正权值)

步骤:

dis表示的是距离起点的距离 st表示这个点的距离确定没有

1、初始化距离 让全部的dis全都为0x3f 但是要让dis[1]=0

2、有n个点要进行n次迭代 在每次迭代的过程中去找到不在集合中 并且dis[j]最小

3、然后根据2找到的这个数去更新其他的dis[]

4、要是n和m的差距很大的化 就可以用邻接矩阵

需要注意的是 刚开始st[1] 不要赋值为true 因为要从起点1进行去迭代其他的点

#include<bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;
int a[N];
int n, m;
string s;
int g[1010][1010];
int dis[N];
bool st[N];
//朴素版的dijkstra算法

void dijkstra() {
	memset(dis, 0x3f, sizeof dis);
	dis[1] = 0;
	for(int i = 0; i < n; ++ i ) {//n个点n次迭代 
		int t = -1;
		for(int j = 1; j <= n; ++ j ) {//找到最小值 
			if(st[j] == false && (t == -1 || dis[t] > dis[j])) {
			//t = -1 || dis[t] > dis[j]的意思是 他先去找到第一个还没用过的 然后去和其他的进行比较 
				t = j;
			}
		}
		st[t] = true;
		for(int j = 1; j <= n; ++ j ) {
			dis[j] = min(dis[j], dis[t] + g[t][j]);
		}
	}
	if(dis[n] > 0x3f3f3f3f / 2)cout << -1 << endl;
	else cout << dis[n] << endl;
}

signed main() {
	cin >> n >> m;
	memset(g, 0x3f, sizeof g);
	
	for(int i = 1; i <= n; ++ i ) {
		g[i][i] = 0;
	}
	for(int i = 1; i <= m; ++ i ) {
		int x, y, v;
		cin >> x >> y >> v;
		g[x][y] = min(g[x][y], v);//有向图 
	}
	dijkstra();
	return 0;
}

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FindYou.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值