最短路问题

news2024/11/20 11:44:07

单源最短路

Dijkstra算法

力扣 743.网络延迟时间

const int N = 7777;
int INF = 0x3f3f3f3f;
class Solution {
    struct edge {
        int v, w;
    };
    vector<edge> e[N];
    int d[N], vis[N];  //d数组存储最短路径长度
    priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        for (vector<int> ed : times) {
            e[ed[0]].push_back({ ed[1],ed[2] });
        }
        for (int i = 1; i <= n; i++) {
            d[i] = INF;
        }
        d[k] = 0;  //源点为0
        //first:源点到节点距离
        //second:节点
        heap.push({ 0,k });  
        while(!heap.empty()) {
            int u = heap.top().second;
            heap.pop();
            if (vis[u])
                continue;
            vis[u] = true;
            for (auto ed : e[u]) {
                int v = ed.v;
                int w = ed.w;
                if (!vis[v] && d[u] + w < d[v]) {
                    d[v] = d[u] + w;
                    heap.push({ d[u] + w, v });
                }
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            if (d[i] == INF)
                return -1; 
            ans = max(ans, d[i]);
        }
        return ans;
    }
};

洛谷模板

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N = 5e5 + 10, INF = 0x3f3f3f3f;
struct edge {
	int v, w;
};
vector<edge> e[N];
int d[N], vis[N];  //d[i]表示源点到i点最短距离 ,vis表示是否从小根堆弹出过
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;

int main() {
	int n, m, s;
	scanf("%d%d%d", &n, &m, &s);
    //邻接表建图
	for (int i = 0; i < m; i++) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		e[u].push_back({ v,w });
	}
	for (int i = 1; i <= n; i++) {
		d[i] = INF;
	}
	d[s] = 0;  //源点初始化为0
	heap.push({ 0,s });
	while (!heap.empty()) {
		auto u = heap.top().second;
		heap.pop();
		if (vis[u])
			continue;
		vis[u] = true;
		for (auto& ed : e[u]) {
		//first:源点到节点距离
		//second:节点
			int v = ed.v;
			int w = ed.w;
			if (!vis[v] && d[u] + w < d[v]) {
				d[v] = d[u] + w;
				heap.push({ d[u] + w, v });
			}
		}
	}
	for (int i = 1; i <= n; i++)
		printf("%d ", d[i]);
}

A*算法

const int N = 1001;

class Solution {
	int move[5] = { 1,0,-1,0,1 };
	int d[N][N];
	bool vis[N][N];
	struct edge {
		int x, y, w;
		bool operator>(const edge& other)const {
			return this->w > other.w;
		}
	};
	priority_queue<edge, vector<edge>, greater<edge>>heap;
public:
	//曼哈顿距离
	int f(int x, int y, int targetX, int targetY) {
		return abs(x - targetX) + abs(y - targetY);
	}

	int minDistance2(vector<vector<int>>& grid, int startX, int startY, int targetX, int targetY) {
		if (grid[startX][startY] == 0 || grid[targetX][targetY] == 0)
			return -1;
		int n = grid.size();
		int m = grid[0].size();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				d[i][j] = INT_MAX;
			}
		}
		d[startX][startY] = 1;
		heap.push({ startX,startY,1+f( startX, startY, targetX, targetY)});
		while (!heap.empty()) {
			auto cur = heap.top();
			int x = cur.x;
			int y = cur.y;
			if (vis[x][y])
				continue;
			vis[x][y] = true;
			for (int i = 0; i < 4; i++) {
				int nx = move[i] + x;
				int ny = move[i + 1] + y;
				if (nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny]) {
					d[nx][ny] = d[x][y] + 1;
					heap.push({ nx,ny,1 + d[x][y] + f(nx,ny,targetX,targetY) });
				}
			}
		}
		return -1;
	}
};

Bellman-Ford与SPFA优化

SPFA流程

洛谷模板

#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<cstring>

using namespace std;
const int N = 4e6 + 10;

struct edge {
    int v, w, ne;
}e[N];
int h[N]; int idx = 1;
int d[N], q[N];  //d[i]源点到节点距离的表 q[i]哪些节点被松弛了放入队列
bool st[N];  //节点是否在队列中
int cnt[N];  //节点被松弛次数
int l = 0, r = 0;

void add(int u, int v, int w) {
    e[idx] = { v,w,h[u] };
    h[u] = idx++;
}

bool  SPFA(int n) {
    d[1] = 0;
    cnt[1]++;
    q[r++] = 1;
    st[1] = true;
    while (l < r) {
        int u = q[l++];
        st[u] = false;
        //考察从u出发的所有边
        for (int i = h[u]; i > 0; i = e[i].ne) {
            int v = e[i].v;
            int w = e[i].w;
            if (d[u] + w < d[v]) {
                d[v] = d[u] + w;
                if (!st[v]) {
                    if (cnt[v]++ >= n)  //松弛次数为n 说明有负环
                        return true;
                    q[r++] = v;
                    st[v] = true;
                }
            }
        }
    }
    return false;
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        l = r = 0;
        memset(e, 0, sizeof(e));
        memset(h, 0, sizeof(h));
        memset(cnt, 0, sizeof(cnt));
        memset(d, 0x7f, sizeof(d));
        memset(st, 0, sizeof(st));
        idx = 1;
        int n, m;
        scanf("%d%d", &n, &m);
        for (int i = 0; i < m; i++) {
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            add(u, v, w);
            if (w >= 0) {
                add(v, u, w);
            }
        }
        printf("%s", SPFA(n) ? "YES\n" : "NO\n");
    }
    return 0;
}

多源最短路

Floyd算法

#include<iostream>
#include<cmath>
#include<climits>
using namespace std;
const int N = 111, M = 11111;
int d[N][N], path[M];
int n, m;

void floyed() {
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
			}
		}
	}
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++) {
		scanf("%d", &path[i]);
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			d[i][j] = INT_MAX;
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			scanf("%d", &d[i][j]);
		}
	}
	floyed();
	int ans = 0;
	for (int i = 2; i <=m; i++) {
		ans += d[path[i - 1]][path[i]];
	}
	printf("%d", ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈的实现及OJ练习(c语言)

目录 前言 栈 栈的实现&#xff08;数组栈&#xff09; 初始化栈 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 检测栈是否为空 销毁栈 最终代码&#xff1a; 选择练习 栈的OJ题 前言 我们在之前已经学习了顺序表和链表的概念&#xff0c;它们有这样的优缺点&a…

周年纪念篇

一周年纪念&#xff01; 凌晨逛手机版csdn时才突然发现已经错过一周年了&#xff0c;但我当闰年来纪念一下不过分吧hhh 浅浅的整些怀念的东西吧&#xff01; 这是人生第一段代码&#xff1a;不是hello world写不起&#xff0c;而是纯爱单推人更有性价比。 有这段代码在&#x…

Zabbix Proxy分布式监控

目录 Zabbix Proxy简介 实验环境 proxy端配置 1.安装仓库 2.安装zabbix-proxy 3.创建初始数据库 4.导入初始架构和数据&#xff0c;系统将提示您输入新创建的密码 5.编辑配置文件 /etc/zabbix/zabbix_proxy.conf&#xff0c;配置完成后要重启。 agent客户端配置 zabbix…

可燃气体监测仪|燃气管网监测解决办法

可燃气体监测仪是城市生命线中&#xff0c;燃气监测运行系统的前端监测设备&#xff0c;其主要作用是对燃气管网的安全状况进行实时监测。燃气管道在使用过程中&#xff0c;由于老化、裂纹、锈蚀等问题&#xff0c;容易导致燃气出现泄漏问题&#xff0c;从而引发一系列的安全事…

强烈 推荐 13 个 Web前端在线代码IDE

codesandbox.io&#xff08;国外&#xff0c;提供免费空间&#xff09; 网址&#xff1a;https://codesandbox.io/ CodeSandbox 专注于构建完整的 Web 应用程序&#xff0c;支持多种流行的前端框架和库&#xff0c;例如 React、Vue 和 Angular。它提供了一系列增强的功能&…

GSVA,GSEA,KEGG,GO学习

目录 GSVA 1&#xff1a;获取注释基因集 2&#xff1a;运行 GSEA 1,示例数据集 2,运行 GSEA_KEGG富集分析 GSEA_GO富集分析 DO数据库GSEA MSigDB数据库选取GSEA KEGG 1&#xff1a;运行 2&#xff1a;绘图 bar图 气泡图 绘图美化 GO GSVA 1&#xff1a;获取注…

springboot实现在线人数统计

在线人数统计 笔者做了一个网站&#xff0c;需要统计在线人数。 在线有两种&#xff1a; 一、如果是后台系统如果登录算在线&#xff0c;退出的时候或者cookie、token失效的时候就算下线 二、如果是网站前台&#xff0c;访问的时候就算在线 今天我们来讲一下第2种情况&…

【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集

【论文解读】FFHQ-UV 论文地址&#xff1a;https://arxiv.org/pdf/2211.13874.pdf 0. 摘要 我们提出了一个大规模的面部UV纹理数据集&#xff0c;其中包含超过50,000张高质量的纹理UV贴图&#xff0c;这些贴图具有均匀的照明、中性的表情和清洁的面部区域&#xff0c;这些都是…

损失函数(Loss Function)与代价函数(Cost Function)、目标函数(Objective Function)区别

损失函数定义在单个样本上&#xff0c;算的是一个样本的误差。 代价函数定义在整个训练集上&#xff0c;是所有样本误差的平均&#xff0c;也就是损失函数的平均。 目标函数定义为最终需要优化的函数&#xff0c;等于经验风险 结构风险&#xff08;也就是Cost Function 正则化…

Windows10下Mysql8.0安装教程

文章目录 1.下载Mysql8.02.解压Mysql安装包到指定目录3.初始化Mysql服务4.安装Mysql服务5.启动Mysql服务6.登录Mysql服务7.修改Mysql密码8.重启Mysql服务停止服务启动服务 1.下载Mysql8.0 链接&#xff1a;https://pan.baidu.com/s/1uP2xZj8g05xg-oHX_nfnmA 提取码&#xff1a;…

基于SSM的在线投稿系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

C/C++字符判断 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C字符判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C字符判断 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 对于给定的字符&#xff0c;如果该字符是大小写字母或…

团结引擎已全面支持 OpenHarmony 操作系统

Unity 中国宣布与开放原子开源基金会达成平台级战略合作。 据称团结引擎已全面支持 OpenHarmony 操作系统&#xff0c;同时将为 OpenHarmony 生态快速带来更多高品质游戏与实时 3D 内容。Unity 称现在用户可以 “在 OpenHarmony 框架中感受到与安卓和 iOS 同样丝滑的游戏体验”…

网络运维与网络安全 学习笔记2023.11.18

网络运维与网络安全 学习笔记 第十九天 今日目标 冲突域和交换机工作原理、广播域和VLAN原理 VLAN配置、TRUNK原理与配置、HYBRID原理与配置 冲突域和交换机工作原理 冲突域概述 定义 网络设备发送的数据&#xff0c;产生冲突的区域&#xff08;范围&#xff09; 对象 “数…

HUAWEI华为MateBook X 2020款i5集显(EUL-W19P)原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1eZuLjarWH2PjAWVqMWnzjQ?pwd2374 提取码&#xff1a;2374 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为电脑管家等预装程序

LeetCode(28)盛最多水的容器【双指针】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 盛最多水的容器 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水…

python——第十天

今日目标&#xff1a; 常见排序和查找 常见排序和查找: 冒泡排序 选择排序 插入排序 选择排序&#xff1a; 假设"第一个值"是最小值&#xff0c;就要每一轮找到真正的最小值&#xff0c;并且和假设的这个值交换 [1, 3, 2, 10, -8, 9, -30, 7] 1、 [-30, 3, 2, 10, -8…

微信小程序开发学习——页面布局、初始导航栏与跳转

1.盒模型 要求实现效果如图所示&#xff1a; 所有WXML元素都可以看作盒子&#xff0c;在WXSS中"box model”这一术语是用来设计和布局时使用盒模型本质上是一个盒子&#xff0c;封装周围的WXML元素它包括: 边距&#xff0c;边框&#xff0c;填充和实际内容&#xff0c;模…