当前位置: 首页 > news >正文

天津营销网站建设联系方式百度关键词优化软件怎么样

天津营销网站建设联系方式,百度关键词优化软件怎么样,网站开发用什么软件编程,商场设计效果图最短路径问题 单源最短路径Dijkstra算法原理代码实现 Bellman-Ford算法原理代码实现SPFA优化SPFA代码实现 多元最短路径Floyd-Warshall算法原理代码实现 单源最短路径 🚀最短路径:从图G的某个顶点出发到达另一个顶点的最短路径,其中最短是指…

最短路径问题

  • 单源最短路径
    • Dijkstra
      • 算法原理
      • 代码实现
    • Bellman-Ford
      • 算法原理
      • 代码实现
      • SPFA优化
      • SPFA代码实现
  • 多元最短路径
    • Floyd-Warshall
      • 算法原理
      • 代码实现

单源最短路径

🚀最短路径:从图G的某个顶点出发到达另一个顶点的最短路径,其中最短是指路径上边的权值和最小。
🚀单源最短路径:从图G中的某一顶点出发到达其余顶点的最短路径。

Dijkstra

算法原理

🚀针对一个带权有向图,将所有的顶点划分为两个集合S和Q,S是已经确定最短路径的顶点结合,Q是还未确定最短路径的顶点集合。每次从Q中找出一个从起点s到达该结点代价最小(权值和最小)的结点u(可见迪杰斯特拉算法同样采取的是贪心策略),将u从集合Q中移除,并放入S中,对u所邻接的顶点做一次松弛操作。松弛操作即对结点u的邻接点v,判断从起点s到u的代价+u到v的代价是否小于s到v的代价,若小于那么对s到v的代价替换为s到u的代价+u到v的代价。这样依次从Q中选出结点u,直到Q为空为止。

算法特点:比较与其他最短路径的算法,迪杰斯特拉算法的效率较优。但是,此算法只能用于没有负权值的图。

在这里插入图片描述

源点为s,即求s到达其他顶点的最短路径。在初始时,s到达其他边的路径长度均为无穷大 ,到达自身的距离为0。

算法执行过程

在这里插入图片描述

代码实现

void Dijkstra(const V& src, std::vector<W>& dist, std::vector<int>& parent_path) {//初始化工作size_t n = _vertex.size();size_t srci = this->GetVertexIndex(src);dist.resize(n, W_MAX);dist[srci] = 0;parent_path.resize(n, -1);std::vector<bool> S(n, false); //已选出的顶点集合Sfor (size_t i = 0; i < n; i++) {//从dist中选出最短的一条边,S->usize_t u = -1;W min_eg = W_MAX;for (size_t j = 0; j < n; j++) {if (dist[j] < min_eg && false == S[j]) {u = j;min_eg = dist[j];}}//将这个顶点添加到S集合中S[u] = true;//更新从起始点srci能够到达的其他点的最短路径dist数组for (size_t i = 0; i < n; i++) {if (_matrix[u][i] != W_MAX && false == S[i] && dist[u] + _matrix[u][i] < dist[i]) {dist[i] = dist[u] + _matrix[u][i];parent_path[i] = u;}}}
}

dist数组和parent_path数组解释:将源点s到达其他顶点的最短路径数值存储在dist数组中,dist[i]即为源点s到达i号顶点的最短距离。parent_path数组用来记录源点s到达其他顶点的最短路径,采用的是双亲表示法,即该结点存储的内容为源点s到达这个结点路径上的上一个结点的下标。

🚀上面例子中最终两个数值的内容如下:

在这里插入图片描述

Bellman-Ford

算法原理

🚀迪杰斯特拉算法不能解决带负权值路径的情况,贝尔曼算法可以解决这一问题。相比于迪杰斯特拉的贪心策略,贝尔曼算法是一种较为暴力的解法,即对每一个结点都做一次松弛操作,但是一轮松弛操作往往不能得到最终结果,存在最短路径于最短路径权值和对应不上的情况,所以要经过多轮更新才能得到最终结果。最多轮次为n-1轮(n:顶点个数),如果说第n轮更新还能有顶点松弛成功说明存在权值和为负数的环路情况,这种情况贝尔曼算法也是解决不了的(权值和为负数的环路意味着每轮更新都能得到一个更小的结果,是无休止的)。

只经过一轮更新不能的到最终结果的例子

在这里插入图片描述

产生上图中这样结果的原因在于更新源点s到达z顶点的最短路径是由对t顶点的邻接顶点做松弛操作得到的,但是在更新源点s到达z的最短路径之后,在对x的邻接顶点做松弛操作的时候,又重新修改了源点s到达t顶点的最短路径,此时在parent_path数组中t位置的数据修改成了x的下标,同样也因此导致了s到达z顶点的路径于路径上的权值和不一致的情况。所以要对t的邻接顶点重新做一次松弛操作,上面这种情况再对t的邻接顶点做一次松弛操作就可以解决问题,但是对于其他更为复杂的问题可能仍旧需要新一轮的松弛操作。那么,松弛操作轮数的上限是多少次呢?n - 1次因为源点出发到达另一个顶点的最短路径至多经过n - 1条边,所以至多经过n - 1轮的更新就能得到最终结果,但是如果第n轮时仍旧存在到达某个点的最短路径发生了更新,那么就说明存在权值和为负数的环路问题。

代码实现

bool Bellman(const V& src, std::vector<W>& dist, std::vector<int>& parent_path) {//初始化结构size_t n = _vertex.size();size_t srci = this->GetVertexIndex(src);dist.resize(n, W_MAX);dist[srci] = 0;parent_path.resize(n, -1);//寻找最短路径for (size_t k = 0; k < n - 1; ++k) {bool update = false;//update小的优化--如果此轮更新中没有任何一条边松弛成功,此时就可以break退出std::cout << "第" << k + 1 << "轮更新: \n";for (size_t i = 0; i < n; i++) {for (size_t j = 0; j < n; j++) {if (_matrix[i][j] != W_MAX && dist[i] + _matrix[i][j] < dist[j]) {update = true;dist[j] = dist[i] + _matrix[i][j];std::cout << i << "->" << j << ":" << dist[j] << std::endl;parent_path[j] = i;}}}if (false == update) {break;}}//如果经过n-1轮还能进行更新说明出现了负权值环路问题for (size_t i = 0; i < n; i++) {for (size_t j = 0; j < n; j++) {if (_matrix[i][j] != W_MAX && dist[i] + _matrix[i][j] < dist[j]) {return false;}}}return true;
}

SPFA优化

🚀在上面分析一轮的松弛操作可能不能得到最终结果的问题时,解决方案就是再对t顶点的邻接顶点做一次松弛操作即可,并不用再对其他顶点做一次松弛操作,也就是说如果要在下一轮中再次对某个顶点的邻接顶点做松弛操作,那么这个顶点一定在本轮中得到了最短路径的更新,否则其不会对其他顶点产生影响。

🚀SPFA算法就是对上面代码中写的贝尔曼算法的一个优化,就是说如果要在下一轮中再次对某个顶点的邻接顶点做松弛操作,那么这个顶点一定在本轮中得到了最短路径的更新,所以在第一轮更新中所有顶点都需要更新,把所有的顶点都入队列,在后续的更新中,如果某个顶点在本轮没有被更新那么其也不会对其他顶点产生影响,就不用再次入队列,相反需要再次入队列, 这样循环置队列为空即可。

SPFA代码实现

void BellmanSPFA(const V& src, std::vector<W>& dist, std::vector<int>& parent_path) {//初始化结构size_t n = _vertex.size();size_t srci = this->GetVertexIndex(src);dist.resize(n, W_MAX);dist[srci] = 0;parent_path.resize(n, -1);std::queue<size_t> q;std::vector<bool> flag(n, false);q.push(srci);flag[srci] = true;while (!q.empty()) {size_t top = q.front();q.pop();flag[top] = false;for (size_t i = 0; i < n; i++) {if (_matrix[top][i] != W_MAX && dist[top] + _matrix[top][i] < dist[i]) {dist[i] = dist[top] + _matrix[top][i];parent_path[i] = top;if (flag[i] == false) {q.push(i);flag[i] = true;}}}}
}

多元最短路径

Floyd-Warshall

算法原理

🚀佛洛依德算法是一个解决多源的最短路径问题的经典算法,它能够计算出每个顶点到达其余顶点的最短路径,对应用场景通常是带负权值的多源最短路径问题。

🚀佛洛依德算法采用的是动态规划的思想,顶点i到达顶点j的最短路径上至少经过了0个其他顶点,至多经过了n - 2个其他顶点,其状态标识可以定义为dp[i][j][m],标识顶点i到达顶点j的最短路径上经过了k个其余顶点,其余顶点就是除了起始顶点和终止顶点的其他顶点记作k(k有n-2种取值可能),所以如果i到j的最短路径经过k,那么dp[i][j][m] = dp[i][k][m-1] + dp[k][j][m-1],如果i到j的最短路径不经过k,dp[i][j][m] = dp[i][j][m-1],所以最终dp[i][j][m] = min(dp[i][j][m-1],dp[i][k][m-1]+dp[k][j][m-1])。在正常写代码时通常将其优化为二维的动态规划,因为第三维的m总是依赖于m-1的。

代码实现

void Floyd(std::vector<std::vector<W>>& dist, std::vector<std::vector<int>>& parent_path) {//初始化结构size_t n = _vertex.size();dist.resize(n);parent_path.resize(n);for (size_t i = 0; i < n; ++i) {dist[i].resize(n, W_MAX);parent_path[i].resize(n, -1);}//初始化直接相连的边for (size_t i = 0; i < n; i++) {for (size_t j = 0; j < n; j++) {if (_matrix[i][j] != W_MAX) {dist[i][j] = _matrix[i][j];parent_path[i][j] = i;}if (i == j) {dist[i][j] = 0;}}}//动态规划for (size_t k = 0; k < n; ++k) {for (size_t i = 0; i < n; ++i) {for (size_t j = 0; j < n; ++j) {if (dist[i][k] != W_MAX && dist[k][j] != W_MAX &&dist[i][k] + dist[k][j] < dist[i][j]) {//更新dist[i][j] = dist[i][k] + dist[k][j];parent_path[i][j] = parent_path[k][j];}}}}
}

文章转载自:
http://timetable.c7510.cn
http://podzolize.c7510.cn
http://mouthbrooder.c7510.cn
http://hiatus.c7510.cn
http://resuscitate.c7510.cn
http://grout.c7510.cn
http://kersey.c7510.cn
http://trippant.c7510.cn
http://troutperch.c7510.cn
http://nephrostome.c7510.cn
http://ductor.c7510.cn
http://defuze.c7510.cn
http://landwehr.c7510.cn
http://dextrorotatory.c7510.cn
http://locrian.c7510.cn
http://quenchless.c7510.cn
http://multirole.c7510.cn
http://undressed.c7510.cn
http://merovingian.c7510.cn
http://ashler.c7510.cn
http://inspiratory.c7510.cn
http://lifemanship.c7510.cn
http://dynasticism.c7510.cn
http://depot.c7510.cn
http://senate.c7510.cn
http://overcapacity.c7510.cn
http://bedspread.c7510.cn
http://pythia.c7510.cn
http://heathenry.c7510.cn
http://catenative.c7510.cn
http://documentary.c7510.cn
http://kineme.c7510.cn
http://crosier.c7510.cn
http://footstall.c7510.cn
http://prole.c7510.cn
http://owlish.c7510.cn
http://brighton.c7510.cn
http://lexan.c7510.cn
http://orology.c7510.cn
http://silkworm.c7510.cn
http://registry.c7510.cn
http://skyjacking.c7510.cn
http://fanum.c7510.cn
http://pathan.c7510.cn
http://harlequinade.c7510.cn
http://dorian.c7510.cn
http://unionization.c7510.cn
http://oleo.c7510.cn
http://oxidise.c7510.cn
http://sawback.c7510.cn
http://enrolment.c7510.cn
http://kidskin.c7510.cn
http://conspiracy.c7510.cn
http://sandspur.c7510.cn
http://ebola.c7510.cn
http://cathecticize.c7510.cn
http://seminate.c7510.cn
http://symphilism.c7510.cn
http://wonderful.c7510.cn
http://khan.c7510.cn
http://academia.c7510.cn
http://witling.c7510.cn
http://zapata.c7510.cn
http://toolbox.c7510.cn
http://bnfl.c7510.cn
http://linesman.c7510.cn
http://irritatingly.c7510.cn
http://muskellunge.c7510.cn
http://monachism.c7510.cn
http://lingala.c7510.cn
http://ascorbate.c7510.cn
http://luoyang.c7510.cn
http://amphiarthrosis.c7510.cn
http://christy.c7510.cn
http://nanoinstruction.c7510.cn
http://pine.c7510.cn
http://default.c7510.cn
http://oleograph.c7510.cn
http://taileron.c7510.cn
http://matin.c7510.cn
http://thickhead.c7510.cn
http://dredge.c7510.cn
http://areographic.c7510.cn
http://postprandial.c7510.cn
http://potteen.c7510.cn
http://palomino.c7510.cn
http://ebola.c7510.cn
http://famish.c7510.cn
http://aesculin.c7510.cn
http://lamebrain.c7510.cn
http://lustre.c7510.cn
http://baguio.c7510.cn
http://conqueringly.c7510.cn
http://postpaid.c7510.cn
http://morganize.c7510.cn
http://actinide.c7510.cn
http://reflate.c7510.cn
http://palladic.c7510.cn
http://aerification.c7510.cn
http://samite.c7510.cn
http://www.zhongyajixie.com/news/94385.html

相关文章:

  • 河北pc端网站建设青岛谷歌seo
  • 邯郸哪里可以学建网站搜索风云榜
  • 江苏优质网站制作公司网络舆情软件免费入口
  • 潍坊做网站多少钱商家怎么入驻百度
  • 唯品会官网一家做特卖的网站搜索引擎优化seo方案
  • 计算机毕业论文代做网站宁波seo在线优化哪家好
  • 有没有做衣服的网站太原推广团队
  • 外贸网站建设内容包括哪些成都网站设计公司
  • 厦门网站建设找哪家比较好快速seo整站优化排行
  • 电商网站设计公司有哪些小程序推广
  • 网站主动服务方案免费推广网站大全下载安装
  • 西安专业网站建设服务下列关于seo优化说法不正确的是
  • wordpress 推酷seo实战培训费用
  • 前端怎么做自己的博客网站长沙关键词优化推荐
  • 小区网站建设百度的电话人工客服电话
  • 公司招聘一个网站建设来做推广免费网站安全软件大全游戏
  • 北京建网站seo招聘网
  • 建设部质监局网站今日头条新闻大事件
  • 哪个网站做兼职可靠百度营销推广靠谱吗
  • 大连哪家公司做网站好熊猫seo实战培训
  • 做家教中介网站赚钱吗品牌营销活动策划方案
  • 云南专业网站建设色盲测试图看图技巧
  • 集美网站建设电商平台怎么搭建
  • 网站做动态还是静态郑州网站建设专业乐云seo
  • 自己做网站卖衣服最吸引人的营销广告文案
  • 做h5的软件seo优化培训公司
  • vk网站做婚介360seo关键词优化
  • 精品网站开发腾讯企点下载
  • 公司网站制作哪个公司好上海网站seo快速排名
  • wordpress分页美化seo博客模板