Dijkstra算法(简单讲解+vector实现代码+优先队列优化)

Dijkstra算法是干什么的?

Dijkstra算法的用处就是求单源最短路。注意是单源(意思是求从一个点出发到其他点的最短路),多源最短路(所有点两两直接的最短路)要用Floyd算法求。

它的原理是什么?

从一个点出发,遍历与之相连的点。再从这些点中路径到达的点出发对连边松弛。

需要注意的是使用这个算法,边权不能为负。

如何实现?

        利用广度搜索。

  • 将起始点dis设为0。
  • 选择当前未标记的点中dis值最小的,并对它的所有连边进行松弛。并标记该点。
  • 松弛成功则更新的点入队。
  • 重复2,3步,直到队列为空。
#include<bits/stdc++.h>
using namespace std;
#define int long long

struct node
{
	int to,w;
	bool operator <(const node &x)const
    {
        return x.w<w;
    }
};
vector<node>a[200005];
priority_queue<node>q;
int n,m,dis[200005],bj[200005],s;
void dij()
{
	dis[s]=0;
	q.push(node{s,0});
	while(!q.empty())
	{
		node ovo=q.top();
		q
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用C语言的优先队列库来实现dijkstra算法,例如STL中的priority_queue或者自己实现一个堆来作为优先队列。以下是使用STL中的priority_queue实现dijkstra算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <limits.h> #include <queue> #define MAXN 1000 using namespace std; typedef struct Edge { int to, w; struct Edge *next; } Edge; Edge *head[MAXN]; int dist[MAXN]; bool vis[MAXN]; void add_edge(int u, int v, int w) { Edge *e = (Edge*)malloc(sizeof(Edge)); e->to = v; e->w = w; e->next = head[u]; head[u] = e; } void dijkstra(int s, int n) { memset(dist, 0x3f, sizeof(dist)); memset(vis, false, sizeof(vis)); dist[s] = 0; priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq; pq.push(make_pair(0, s)); while (!pq.empty()) { int u = pq.top().second; pq.pop(); if (vis[u]) continue; vis[u] = true; for (Edge *e = head[u]; e != NULL; e = e->next) { int v = e->to, w = e->w; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.push(make_pair(dist[v], v)); } } } } int main() { int n, m, s; scanf("%d%d%d", &n, &m, &s); for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); add_edge(u, v, w); } dijkstra(s, n); for (int i = 1; i <= n; i++) { printf("%d ", dist[i]); } printf("\n"); return 0; } ``` 这个代码实现了使用优先队列实现dijkstra算法,其中priority_queue是STL中的优先队列,用于存储节点到源点的距离和节点编号的pair,按照距离从小到大排序。在每次取出队首元素时,如果该节点已经被访问过,则跳过,否则将其标记为已访问,并遍历其所有出边,更新到其它节点的距离。如果某个节点的距离被更新,则将其加入优先队列中,以便下一次取出时能够得到最小的距离。最终输出源点到所有节点的最短距离。 lua closure factory 完整代码: ```lua function new_counter() local count = 0 return function() count = count + 1 return count end end local counter1 = new_counter() local counter2 = new_counter() print(counter1()) -- 1 print(counter1()) -- 2 print(counter2()) -- 1 print(counter2()) -- 2 ``` 这段代码实现了一个闭包工厂,用于创建计数器函数。每次调用new_counter函数都会返回一个新的计数器函数,该函数内部维护一个计数器变量count,并在每次调用时将其加1并返回。由于每个计数器函数都有自己的count变量,因此可以实现多个计数器同时存在而不会互相干扰。在示例代码中,创建了两个计数器counter1和counter2,并分别调用它们两次,输出结果为1、2、1、2。 中文加密: 中文加密是指将中文文本转换为一串密文,以保护文本的机密性。常见的中文加密算法包括DES、AES、RSA等。其中DES是一种对称加密算法,AES和RSA是一种非对称加密算法。 对称加密算法指加密和解密使用相同的密钥,因此密钥的安全性非常重要。DES算法使用56位的密钥,将明文分成64位的块,经过16轮加密后得到密文。AES算法使用128位、192位或256位的密钥,将明文分成128位的块,经过多轮加密后得到密文。对称加密算法的优点是加密速度快,缺点是密钥的管理比较困难。 非对称加密算法指加密和解密使用不同的密钥,其中一个密钥称为公钥,另一个密钥称为私钥。RSA算法使用两个大素数作为私钥,将其乘积作为公钥,将明文转换为一个整数后进行加密,得到密文后再用私钥解密。非对称加密算法的优点是密钥管理方便,缺点是加密速度慢。 中文加密算法的选择应该根据具体的需求和场景来决定,需要综合考虑加密强度、加密速度、密钥管理等因素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值