IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++队列优化的bellman算法 -> 正文阅读

[数据结构与算法]C++队列优化的bellman算法

普通的bellman算法如下

	for(int i=1;i<=n-1;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(dis[v[j]]>dis[u[j]]+w[j])
			{
				dis[v[j]]=dis[u[j]]+w[j];
			}
		}
	}

此处需进行n-1次循环来判断是否已经达到最短路径,但其实有些点在n-1之前已经求得最短路径了,所以采用队列+邻接表来进行优化,把一个顶点的所有出边全都处理完了,然后把这个点出队即可。因为很可能不会再利用这个顶点来松弛了(出边都用完了)。

//核心代码
while(q.size()!=0)//队列不为0时就说明有的点没处理完
 {
  k=first[q.front()];//从队首的第一条边开始
  while(k!=0)
  {
   if(dis[v[k]]>dis[u[k]]+w[k])
   {
    dis[v[k]]=dis[u[k]]+w[k];//松弛
    if(b[v[k]]==0)//这是一个标记数组,要是b[i]=1就不用再入队了
    {
     q.push(v[k]);
     b[v[k]]=1;
    }
   }
  k=next[k];
  b[q.front()]=0;//把队首的b[i]标记为0,以便下次再进入队列
  //再进入队列是因为可能有到次顶点的边,例如点3的出边遍历完了
  //但是有可能还有2 3 1,这样 到3 的边
  //这时候可能3的最短路径会发生变化,需要重新松弛其所有出边
  q.pop();//把队首出队
  }
 }

完整代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
 int n,m,inf=99999;
 queue <int> q;
 int u[100],v[100],w[100];
 int first[100]={0},next[100]={0};
 int dis[100],b[100]={0};
 cin>>n>>m;
 for(int i=2;i<=n;i++)
 {
  dis[i]=inf;
 }
 dis[1]=0;
 for(int i=1;i<=m;i++)
 {
  cin>>u[i]>>v[i]>>w[i];
  next[i]=first[u[i]];
  first[u[i]]=i;
 }
 q.push(1);
 b[1]=1;
 int k;
 while(q.size()!=0)
 {
  k=first[q.front()];
  while(k!=0)
  {
   if(dis[v[k]]>dis[u[k]]+w[k])
   {
    dis[v[k]]=dis[u[k]]+w[k];
    if(b[v[k]]==0)
    {
     q.push(v[k]);
     b[v[k]]=1;
    }
   }
  k=next[k];
  b[q.front()]=0;
  q.pop();
  }
 }
 for(int i=1;i<=n;i++)
 {
  cout<<dis[i]<<" ";
 }
 return 0;
}

样例
5 7
1 2 2
1 5 10
2 3 3
2 5 7
3 4 4
4 5 5
5 3 6

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:19:22  更:2022-01-16 13:20:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:54:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码