- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
一种存储图的数据结构 。
建立一个结构体和一个数组加一个变量,这里的to代表边 \((u,v)\) 中的 \(v\) 结点,而 \(edge\) 数组的索引 \(idx\) 代表 \(u\) ,其中 \(w\) 代表权值, \(next\) 代表以 \(u\) 为起始点的上一个边。 \(head\) 代表这个 \(x\) 结点在 \(edge\) 数组中的最后一个边的下标索引, \(cnt\) 用于记录边时当 \(edge\) 的下标索引用.
struct {
int to, w, next;
} edge[MAX_N];
int head[MAX_N], cnt = 0;
为链式前向星添加边 。
++cnt
为新添加的边选择一个空变量 edge[++cnt].next=head[u]
代表让 \(edge[cnt]\) 中的 \(next\) 变量指向 \(u\) 结点的上一个边
edge[++cnt].next=head[u];
edge[cnt].w=w;
edge[cnt].to=v;
head[u]=cnt;
遍历 。
首先获取结点 \(x\) 的最后一条边,经过数据处理后,将i移向结点 \(x\) 的上一条边 。
for(int i=head[x];i;i=edge[i].next)
求最小单源路径 。
松弛:对于每个顶点v∈V,都设置一个属性 \(d[v]\) ,用来描述从源点s到v的最短路径上权值的上界,称为最短路径估计。就是这个操作 \(dis[edge[i].to] = dis[v] + edge[i].w;\) 。
queue<int> que;
que.emplace(s);
vis[s] = true;
while (!que.empty()) {
int v = que.front();
que.pop();
vis[v] = false;
for (int i = head[v]; i; i = edge[i].next) {
if (dis[v] + edge[i].w < dis[edge[i].to]) {
dis[edge[i].to] = dis[v] + edge[i].w;
if (!vis[edge[i].to]) {
que.emplace(edge[i].to);
vis[edge[i].to] = true;
}
}
}
}
求是否存在负环 。
如果一个图存在负环,那么其的最短路径一定会存在一个无限循环,经过负环后,路径越来越小,那么一定有一些结点,一直入队出队,判断是否有结点入队次数大于 \(n\) 次 。
queue<int> que;
que.emplace(1);
vis[1]=true,dis[1]=0;
while (!que.empty()) {
int v = que.front();
que.pop();
vis[v] = false;
fe(ver, G[v]) if (dis[ver.to] > dis[v] + ver.cost) {
dis[ver.to] = dis[v] + ver.cost;
if (!vis[ver.to]) {
if (++cnt[ver.to] >= n) {
//存在负环
}
que.emplace(ver.to);
vis[ver.to] = true;
}
}
}
最后此篇关于SPFA和链式前向星的文章就讲到这里了,如果你想了解更多关于SPFA和链式前向星的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
一 点睛 SPFA 算法是 Bellman-Ford 算法的队列优化算法,通常用于求解负权边的单源最短路径,以及判断负环。在最坏的情况下,SPFA 算法的时间复杂度和 Bellman-Ford 算法相
一 点睛 SPFA 算法是 Bellman-Ford 算法的队列优化算法,通常用于求解负权边的单源最短路径,以及判断负环。在最坏的情况下,SPFA 算法的时间复杂度和 Bellman-Ford 算法相
一 点睛 SPFA 算法是 Bellman-Ford 算法的队列优化算法,通常用于求解负权边的单源最短路径,以及判断负环。在最坏的情况下,SPFA 算法的时间复杂度和 Bellman-Ford 算法相
我正在实现一个 k 最短顶点不相交路径算法并且需要一个 寻找最短路径的快速算法。有负权重所以我不能 使用 dijkstra 和 bellman-ford 是 O(ne)。在我最近读到的一篇论文中,作者
在具有负权重和正权重的有向图中使用下面的 SPFA 算法,我们如何检测负循环? 程序最短路径更快算法(G, s) 1 for each vertex v ≠ s in V(G) 2
我是一名优秀的程序员,十分优秀!