zoukankan      html  css  js  c++  java
  • Bellman-Ford最短路径

    对于前面说到的最短路径的求解方法,不能解决负权边的情况,而Bellman-Ford却可以

    共有n个顶点,m条边,每次输入u[i],v[i],w[i],代表从u[i]到v[i]的距离是w[i],对于所有的顶点进行n-1次松弛

    更多详细的内容在代码中会讲解,大家还是直接看代码吧^...^

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 const int inf=99999999;
     6 using namespace std;
     7 int main()
     8 {
     9     int u[105],v[105],dis[105],w[105],te[105];
    10     int m,n;
    11     while(cin>>n>>m){
    12         for(int i=1;i<=m;i++){
    13             cin>>u[i]>>v[i]>>w[i];
    14         }
    15         for(int i=1;i<=n;i++)
    16 
    17             dis[i]=inf;///初始值设为无穷大,这样就会从第一个结点开始逐渐松弛,向后面的结点开始扩展
    18         dis[1]=0;///将原点设为1
    19         for(int i=1;i<=n-1;i++){
    20                 for(int k=1;k<=n;k++)te[k]=dis[k];///这里把dis的初始值记录在te数组中,以便在后面我们判断是否所有的点都已经松弛完成,我们知道这个算法的最坏的情况是要松弛n-1次,但是在实际中很多情况我们提前就已经松弛完成啦,在这里加入这一步可以提前退出循环
    21             for(int j=1;j<=m;j++){
    22                 if(dis[v[j]]>dis[u[j]]+w[j])
    23                     dis[v[j]]=dis[u[j]]+w[j];
    24             }
    25         int check=0;
    26         for(int i=1;i<=n;i++){
    27             if(dis[i]!=te[i]){
    28                 check=1;
    29                 break;
    30             }
    31         }
    32         if(check==0)break;///当在新一轮的松弛中我们发现所有点的dis值都没有改变,这就表明所有的点都已经松弛完成啦
    33         }
    34         int flag=0;
    35         for(int i=1;i<=m;i++)
    36             if(dis[v[i]]>dis[u[i]]+w[i])flag=1;///当松弛完毕后如果还能找到可以继续松弛的边的话就代表含有负权边,我们通常用这种方法检查是否含有负权回路
    37         if(flag==1)cout<<"此图含有负权回路";
    38         else {
    39 
    40             for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
    41             cout<<endl;
    42         }
    43     }
    44 }
    View Code
    你若盛开,清风自来...
  • 相关阅读:
    elinput 金额校验
    使用PHPExcel实现Excel文件的导入和导出(模板导出) (转载自用)
    Scrapy 轻松定制网络爬虫
    在线学习(Online Learning)
    AdaBoost ,online Adaboost
    斯坦福飞鱼滑翔装置完胜跳跃机器人
    机器学习中的集成学习方法(一)理论
    Boosting, Online Boosting,adaboost
    struts.xml配置方法
    java实现单向链表
  • 原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5878227.html
Copyright © 2011-2022 走看看