《算法导论(原书第3版)》第24章部分题目解答

第24章 单源最短路径

24.1 Bellman-Ford算法

24.1-4

思路:

先做|V|-1遍松弛操作,然后再做一遍松弛操作,对于这次松弛操作中dist值被更新的点,必然包含了每个负环中的至少一个点。对于这些点做dfs查找它们能够在图中到达哪些点,所有被搜索到的点即为题目要求找的点

部分c++代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = ...;
const int inf = 0x3f3f3f3f;//正无穷
struct E{
  int x,y,z;//三元组(x,y,z)表示一条有向边。从x出发到y,权值为z。
}
vector<E> es;//存边
vector<int> e[maxn];//模拟邻接链表
vector<int> vec;//存起始点
void bellman(int s){
  for(int i = 1; i<=n; i++)d[i]=inf;
  d[s] = 0;
  for(int t = 1; t<n; t++){
    for(auto e:es){
      if(d[e.x]!=inf && d[e.x]+e.z<d[e.y])d[e.y] = d[e.x] + w;
    }
  }
  for(auto e:es){
    if(d[e.x]!=inf && d[e.x]+e.z<d[e.y]){
      vec.push_back(y);
    }
  }
}
int v[maxn];
void dfs(int x){
  v[x] = 1;
  for(auto y: e){
    if(!v[y]) dfs(y);
  }
}
void solve(int s){
  bellman(s);
  for(auto x:vec){
    if(!v[x]) dfs(x);
  }
  for(int i = 1; i<=n; i++){
    if(v[i]) cout<<"负无穷"<<endl;
    else if(d[i]==inf) cout<<"不可达"<<endl;
    else cout<<d[i]<<endl;
  }
}

24.1-5

思路:

跑一遍Bellman-Ford算法,具体做法如下:
1、初始化\(\forall v\in V ,d[v] = 0\)。
2、对于边(x,y,z),如果d[y]>d[x]+z,更新d[y]。

证明:

首先,一个点对自身的距离为0,所以\(\forall v\in V,\delta^*(v)\leq 0\),可以将每个点d[v]初始化为0
接下来证明更行操作的正确性:
设\(\delta_i(u,v)\)为从u到v边数不超过I的路径的最小值\(u,v\in V\)
同时,设\(\delta_i^*(v) = min_{u\in V}\{\delta_i(u,v)\}\)
这样我们便有 \(\delta^*(v)=\delta_{n-1}^*(v)\)
只要我们证明,对于\(0\leq i<n\),均有\(d[v]\leq \delta_i^*(v)\)且最后\(d[v] = \delta_{n-1}^*(v)\)即可
1、i==0时,\(d[v]\leq \delta^*(v) = 0\)
2、假设前i次迭代中\(d[v]\leq \delta_i^*\)成立
对于第i+1次迭代,
如果\(\delta_{i+1}^* = \delta_{i}^*\),
\(d[v] \leq \delta_{i+1}^*(v) = \delta_i^*(v)\)仍成立
否则,在此轮中边(u,v)被松弛,有\(d[v] = min\{d[u]+w(u,v)\}\)\(\leq min\{\delta_i^*(u)+w(u,v)\} = \delta_{i+1}^*(v)\),仍成立。
综上,所以有\(d[v]\leq \delta_{n-1}^*\)
因为d[v]为两顶点路径长,所以\(d[v] = \delta_{n-1}^*(v)\)
(以上证明前提是图中无负环,实际程序中将负环判掉了)

部分c++代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = ...;
struct E{
  int x,y,z;//三元组(x,y,z)表示一条有向边。从x出发到y,权值为z。
}
vector<E> es;//存边
int d[maxn];
bool bellman(){
  memset(d,0,sizeof(d));
  for(int t = 1; t<n; t++){
    for(auto e:es){
      if(d[e.y]>d[e.x]+z) d[e.y] = d[e.x] + z;
    }
  }
  for(auto e:es){
    if(d[e.y]>d[e.x]+z) return false;
  }
  return true;
}
void solve(){
  if(bellman()){
    for(int i = 1; i<=n; i++)cout<<d[i]<<endl;
  } else{
    cout<<"有负环";
  }
}

24.3 Dijkstra算法

24.3-6

24.3-8

24.3-9

24.3-10

原文地址:https://www.cnblogs.com/baoliang/p/12127745.html

时间: 2024-10-22 10:09:31

《算法导论(原书第3版)》第24章部分题目解答的相关文章

【炼数成金 RapidMiner 一 】数据挖掘概念与技术原书第三版(第一章)1.9节的习题解

1.数据挖掘是指从大量的数据中提取有用的知识信息的一种模式. (1)因为现在的生活工作中随时随刻都在产生大量的数据和都需要将这些数据转变为有用的信息和知识,是因为需求的不断增加才会突显出数据挖掘技术的重要性,所以数据挖掘应该是信息技术发展带来的结果. (2)数据挖掘应该是这些技术融合而不是简单的变革. (3)数据库技术带动了数据收集技术的发展和数据库建立的机制,有了有效的数据管理,包括数据存储.检索.查询和事务处理机制.大量的数据库系统提供的查询和事务处理,自然地产生了对数据分析和理解的必要性,

信息论基础 原书第2版.pdf

下载地址:网盘下载 编辑推荐 <信息论基础>(原书第2版)适合作为电子工程.统计学以及电信方面的高年级本科生和研究生的信息论基础教程教材,也可供研究人员和专业人士参考. 内容简介 <信息论基础>(原书第2版)是信息论领域中一本简明易懂的教材.主要内容包括:熵.信源.信道容量.率失真.数据压缩与编码理论和复杂度理论等方面的介绍.<信息论基础>(原书第2版)还对网络信息论和假设检验等进行了介绍,并且以赛马模型为出发点,将对证券市场的研究纳入了信息论的框架,从新的视角给投资组

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 本章三个非常重要概念:TF,SLAM,AMCL.务必掌握. 补充内容:http://blog.csdn.net/zhangrelay/article/details/50299417 第216页: 简介本章要点. 第217页: 导航综合功能包组成架构等. 补充如下: 目录 配置并使用导航功能

学习PHP爬虫--《Webbots、Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)》

<Webbots.Spiders和Screen Scrapers:技术解析与应用实践(原书第2版)> 译者序 前言 第一部分 基础概念和技术 第1章 本书主要内容3 1.1 发现互联网的真正潜力3 1.2 对开发者来说3 1.2.1 网络机器人开发者是紧缺人才4 1.2.2 编写网络机器人是有趣的4 1.2.3 网络机器人利用了“建设性黑客”技术4 1.3 对企业管理者来说5 1.3.1 为业务定制互联网5 1.3.2 充分利用公众对网络机器人的经验不足5 1.3.3 事半功倍6 1.4 结论

《算法导论》(CLRS)第三版 第1、2章总结(二)

5. 归并排序 (Merge Sort) 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void print(int arr[], int n) { 5 int i; 6 for (i = 0; i < n; i++) { 7 printf("%d ", arr[i]); 8 } 9 printf("\n"); 10 } 11 12 void merge(int arr[], int s,

ROS机器人程序设计(原书第2版)补充资料 (零) 源代码和资料等

ROS机器人程序设计(原书第2版)补充资料 (零) 源代码等 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 稍后会补充,各章节针对indigo版本和kinetic版本的修正说明,方便读者阅读. 可以选用的完整镜像参考:http://blog.csdn.net/zhangrelay/article/details/50176685 已经预装ROS indigo,安装完即可使用,书中全部案例.如果需要了解ROS的实时性,请点击下载. hy

C安全编码标准:开发安全、可靠、稳固系统的98条规则(原书第2版)——互动出版网

这篇是计算机类的优质预售推荐>>>><C安全编码标准:开发安全.可靠.稳固系统的98条规则(原书第2版)> 部分目录 译者序 前言 贡献者简介 第1章 预处理器(PRE) 1 1.1 PRE30-C. 不要通过连接创建通用字符名称 1 1.2 PRE31-C. 避免不安全宏参数的副作用 3 1.3 PRE32-C. 不要在类函数的宏调用中使用预处理器指令 7 第2章 声明和初始化(DCL) 9 2.1 DCL30-C. 声明具有正确存储持续期的对象 10 2.2 DCL

IT项目管理(原书第7版)——互动出版网

这篇是计算机类的优质预售推荐>>>><IT项目管理(原书第7版)> 译者序 1984年,美国项目管理协会(Project Management Institute,PMI)推出了项目管理知识体系(Project Management Body of Knowledge,PMBOK),描述了以项目为研究对象的知识板块,以多维.横断.交叉等全息方式聚集相关知识,反映了当前社会快速发展和变化的需求,得到国际学术界和产业界的积极响应. 在过去的30多年中,随着全球经济和政治的巨