首页 > 其他分享 >「Day 5—最短路径」

「Day 5—最短路径」

时间:2024-08-11 18:20:58浏览次数:7  
标签:cnt int 路径 long 最短 SPFA MAXN include Day

最短路问题

单源最短路

全源最短路

Floyd算法

通过转移方程判断 i -> j 的路径中,是否有 i -> k -> j 更短,运用简单 dp 来转移状态。
f[i][j] 表示 i -> j 的最短路径长度。
但不要忘了初始化,一个点到其本身的最短路径为 1,即 f[i][i] = 1,其余的初始化为 '1e9' 即可。

for(int i = 1;i <= n;i ++){
	for(int j = 1;j <= n;j ++){
		if(i == j){
			f[i][j] = 0;
		}
		else f[i][j] = 1e9;
	}
}
for(int i = 1;i <= n;i ++){
	int u,v,w;
	cin >> u >> v >> w;
	f[u][v] = min(f[u][v],w);
	f[v][u] = min(f[v][u],w);
}
for(int k = 1;k <= n;k ++){
	for(int i = 1;i <= n;i ++){
		for(int j = 1;j <= n;j ++){
			if(f[i][j] > f[i][k] + f[k][j]){
				f[i][j] = f[i][k] + f[k][j];
			}
		}
	}
}

单源最短路

SPFA

我们需要先知道一个前置知识:松弛操作。
那么什么是松弛操作呢,就是当 d[to] > d[v] + e[i].len 的时候,更新 d[to]d[v] + e[i].len 即可。
那么 SPFA 的实现可以通过队列来实现,不断更新当前点所连的点,而每个点可能入队多次。
但 SPFA 容易被卡,所以一般是不用的,但是 SPFA 的最大作用是判负环,如果 cnt[to] + 1 > n 则说明其有负环。

#include<iostream>
#include<math.h>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;

const int MAXN=1e4+5;
const long long INF=2147483647;
struct e {
	int v,w;
};
vector<e> G[MAXN];
queue<long long> q;
long long dis[MAXN],cnt[MAXN];
bool vis[MAXN];
long long n,m,s;

void SPFA() {
	for(int i=1;i<=n;i++){
		dis[i]=INF;
		vis[i]=0;
	}
	dis[s]=0,vis[s]=1;
	q.push(s);
	while(!q.empty()) {
		long long u=q.front();
		vis[u]=0;
		q.pop();
		for(auto edge:G[u]) {
			long long v=edge.v;
			long long w=edge.w;
			if(dis[v]>dis[u]+w) {
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n) return;
				if(!vis[v]) q.push(v);
				vis[v]=1;
			}
		}
	}
	return;
}

int main() {

	cin>>n>>m>>s;

	for(int i=1; i<=m; i++) {
		long long u,v,w;
		cin>>u>>v>>w;
		G[u].push_back({v,w});
	}

	SPFA();

	for(int i=1; i<=n; i++) {
		if(s==i) cout<<"0 ";
		else cout<<dis[i]<<" ";
	}

	return 0;
}

Dijkstra

标签:cnt,int,路径,long,最短,SPFA,MAXN,include,Day
From: https://www.cnblogs.com/To-Carpe-Diem/p/18353685

相关文章

  • 「Day 4—图的存储 & 图上搜索」
    图的基本操作图的存储1.邻接矩阵//对于一个正常的边(u,v,w)vector<int>a[MAXN];a[u].push_back(v);a[v].push_back(u);2.链式前向星//对于一个正常的边(u,v,w)structnode{ intto,next,len;}e[MAXN];inttot=0,h[MAXN];voidadd(intx,inty,intlen){ e[++......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • HDU-ACM 2024 Day2
    T1004a*bproblem(HDU7448)不会。T1005小塔的养成游戏之梦(HDU7449)不会。T1009强攻计策(HDU7453)容易发现初始速度是多少对答案没有影响,所以我们默认初始速度为\(0\)。题意相当于在平面直角坐标系上(横轴为时间,纵轴为速度),有一个目标高度,维护一条尽量接近目标的直线,但......
  • 0811day04
    使用格式化输出的三种方式实现以下输出(name换成自己的名字,既得修改身高体重,不要厚颜无耻)name='Nick'height=180weight=140#"Mynameis'Nick',myheightis180,myweightis140"name='Nick'height=180weight=140print(f"Mynameis{na......
  • 算法笔记|Day22回溯算法IV
    算法笔记|Day22回溯算法IV☆☆☆☆☆leetcode491.递增子序列题目分析代码☆☆☆☆☆leetcode46.全排列题目分析代码☆☆☆☆☆leetcode47.全排列II题目分析代码☆☆☆☆☆leetcode332.重新安排行程(待补充)题目分析代码☆☆☆☆☆leetcode51.N皇后(待补充)题目分析......
  • javase-day01
    aException_Exception01packagecom.se.aException;/***异常,Exception,父类Throwable。与其平级的是Error(Error错误,程序员无法处理,属于JVM级别的错误)*1.程序员可以处理异常。如果不处理,即JVM帮忙处理,简单粗暴,就是终止程序的运行*2.所以,程序员应该处理......
  • Day25 第七章 回溯算法part04 回溯终章
    目录任务491.递增子序列思路46.全排列思路47.全排列II思路心得体会任务491.递增子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序......
  • 动手做科研-day01-AI的最新进展与科研应用
    01.Python程序运行工具以及环境搭建选择使用kaggle官方的notebook作为环境搭建的平台,因为之前使用过kaggle进行注册,因此直接简单登录,按照下图依次进行操作note:需要挂来登录1.点击create2.创建notebook记事本3.尝试写一个简单的helloworld先新建codeprint("hell......
  • (11-4-03)基于SLAM的自主路径导航系统:路径规划(3)
    11.5.3 RRT算法RRT(Rapidly-exploringRandomTree,快速探索随机树)算法是一种用于路径规划的基于树结构的算法,通过在自由空间中随机生成点,并将这些点逐渐连接起来形成树结构,以便找到起点到目标点的可行路径。算法的基本思想是在图形结构中快速生成节点,以便尽快探索整个空间,并......
  • 【路径规划】一种越野环境下车辆驾驶风险规避运动规划算法(Matlab代码实现)
      ......