最短路问题专题

///注意:最短路问题均没有使用递归函数。
/*
Dijkstra  单源最短路问题 用了一个队列
Bellman_Ford 单源最短路  暴搜
Floyd_warshanll  多元最短路问题  dp 直接更新

Dijkstra算法的路径还原*/

Dijkstra算法
Bellman_Floyd算法
Floyd_warshall算法

单源最短路问题  对所有的边进行遍历,更新d的数字
Bellman——floyd 暴力破解
===
const int MAX_E;
const int MAX_V;
const int INF;

struct edge{int from,int to,int cost};
edge G[MAX_E];
int d[MAX_V];
void shortest_path_Bellman_Floyd()
{
    ======
 int i;int v;int start;int finial;
for(int i=0;i<v;++i)
d[i]=INF;
d[start]=0;

while(true)
{
    int flag=0;

    for(int i=0;i<e;++i)
    {
        edge e=G[i];
       if(a [e.from] !=INF&& d[e.from] +e.cost<d[e.to])///这里稍微去一点枝
        {
            d[ e.to ]=d[ e.from ]+e.cost;
            flag=1;
        }
    }
    if(flag==0) break;
}
}

没选过的那些数里面最小的那个就是下一个要去走的
Dijkstra算法
///用重的变量是v 即找到的v的序号以及 v的数量

===
const int MAX_E;
const int MAX_V;
const int INF;

int d[MAX_V];
struct edge{int to,int cost};
vector <edge> G [MAX_V];
int used[MAX_v];
void shortese_path_Dijkstra()

int i;int v;int start;int finial;
for(int i=0;i<v;++i)
d[i]=INF;
d[start]=0;
===将used初始化为0
while(true)
{
     int v1=-1;
    int  min_v=INF;
    ****************
    for(int i=0:i<v;++i)
    {
        if( (!used[i]))
        {
            if(d[i])< min_v {min_v=d[i];v1=i;used[i]=1;} *********别忘记
        }

    }
     *****************
    if(v1==-1)  break;

    for(int i=0;i<G[v1].size;i++)
    {
        int vv=G[v1][i];
        d[vv.to]=min(d[vv.to],d[v1]+vv.cost);
    }

}

Dijkstra算法的第二种实现
使用队列

const int MAX_E;
const int MAX_V;
const int INF;
typedef pair<int int> pa;
///声明成按第一个变量排序的que,从小到大

///(维护d,将新生成的压进去)
///找出来,压进去

void shortest_path_Dijkstra2()
{
    priority_queue<pa,vector<pa>,greater<pa> > que;
    int d[MAX_V];
    int num_v;
    for(int i=0;i<num_v;++i) d[i]=INF; d[start]=0;
    int start;
    int finial;

    que.push(pa(0,start));

    while(!q.empty())
  {
    pa p=que.top();
    que.pop();

    int vertex=p.second;
    for(int i=0;i<v;++i)
    {
        if(d[i]<G[vertex][i]+d[vertex])
         {

             que.push(pa(i,G[vertex][i]+d[vertex]));
              d[i]= G[vertex][i]+d[vertex];
         }
                 ///压进去就好了
    }

  }
}

从数据结构角度
///注意 变量的乱用。。
B: edge d
D: G u d
D2: que  G
///感觉上G与G(edge) 功能一样 不过可能更省空间,但代码复杂点。。。

/*
多源最短路问题 dp的思路
即dp[k][i][j]表示 考虑节点1-k 时从i到j的最短距离

若k是其中一点
dp[k][i][j]=dp[k-1][i][k]+dp[k-1][k][j]
*/
int v;
int e[MAX_V][MAX_V];
for(int i=0;i<v;++i)
    for(int j=0;j<v;++j)
         if(i=j) dp[i][j]=e[i][j];

///不是的话dp[k-1][i][j]
for(int k=0;k<v;++k)
   for(int i=0;i<v;++i)
        for(int j=0;j<v;++j)
               dp[i][j]=min{dp[i][j],dp[i][k]+dp[k][j]};
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ]

]

时间: 2024-12-20 15:20:59

最短路问题专题的相关文章

【团购巨划算】韩立刚老师门徒级学习专题,只此一次的超大优惠福利

Q:韩立刚老师是谁? A:韩老师是51CTO金牌讲师(最高级别),也是微软最有价值专家MVP.微软企业护航专家.<计算机网络原理>一书作者 讲师主页:http://edu.51cto.com/lecturer/400469.html Q:门徒级学习专题是什么? A:韩立刚老师门徒级课程专题(Windows Server+网络安全+数据库) 韩老师从2013年至今,根据企业对IT运维人才的技术要求,录制视频教程49 门,时长达581小时50分钟.旨在从0起点培养企业高端IT人才,让你在企业IT部

c指针-专题

六---指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为[字节]/byte,许多现代机器上,每个字节包含8个位.更大内存单位[字],通常包含2个或4个字节组成. 一个字包含4个字节,它的地址是什么? 他仍然只有一个地址,是最左边还是最右边的那个字节的位置,取决于机器. 机器事实-关于整型的起始位置: 在要求边界对齐(boundaryalignment)的机器上,整型存储的起始位置只能是某些特定的字节,通常是2或4的倍数. 变量名和地址关系? 所有高级语言的特性之一,就是通过名字而

无线安全专题_破解篇03--打造个人字典

上一篇讲解了如何通过Kali破解Pin码,今天继续无线安全专题破解篇的第三讲:打造个人字典.通过第一课,我们知道想要破解WPA加密,需要一个强大的字典.字典的强大直接决定了破解的可能性,废话不多说,咱们就学习一下怎么使用kali中的工具生打造个人字典.  一.crunsh工具介绍 今天主要说的是crunsh这款工具,专门用来生成字典. 命令参数: -b              #体积大小,比如-b 20mib 或者 -b 20kib -c              #密码个数(行数),比如80

最短路径算法专题1----弗洛伊德

由于最短路径算法我认为比较重要,所以分成几个专题来慢慢细化去磨它,不能一口气吃个胖子嘛. 首先在说算法之前,先说清楚什么叫做最短路径. 题目一般会给你一张图,然后告诉你很多地方,然后告诉你各个地方之间的路程有多远,要你求出,两点间的最短距离,注意,题目给出的两点间的距离未必是最短的,可能通过第三个点转换之后达到更短.实际其实也是这样的,有时候两个地方并没有直线的道路只有曲线的绕路. 算法的思路: 1.用二维数组列出所有的距离,达到不了的用最大距离表示,如9999999 2.循环数组上面的每一个点

Cocos3D专题课程源码地址

源码地址 https://github.com/super626/LessonDemo cocos2d引擎版本3.7以上 下载后放置在LessonDemo/cocos2d目录下 MAC配置文件 LessonDemo/proj.ios_mac/LessonDemo.xcodeproj,直接用Xcode打开(Xcode5.1以上).编译桌面版和iOS版. win32配置文件 LessonDemo/proj.win32/LessonDemo.sln,用Visual Studio 2012以上版本打开,

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

KMP专题总结

KMP算法有两种计算失配函数的方法 未优化过的失配函数 , f[i] 就表示 str[0~i-1] 的公共最长前后缀( 不包括str[0~i-1]本身,比如aaa的最长公共前后缀长度为2 ) , 这个特性必须牢记 从下面的例子应该也可以看出 0  1  2  3  4  5  6  7  8  9  10 str  a  a  a  a  b  b  a  a  b  a  '\0' f   0  0  1  2  3  0  0  1  2  0   1 优化过后的失配函数,虽然匹配的性能要好

2014世界杯楼市专题网页设计欣赏

四年一次的世界杯开赛了,看球场上下尽风流,帅气.搞笑.疯狂.养眼,小编在这里为你整理了一些不一样的世界杯专题网页设计,为你呈现一个不一样的视觉体验,下面来一起欣赏一下吧. 特别设计过的主题文字组合,呼应世界杯的狂欢主题,配图世界杯主题色配色,大面积的黄色加上绿色搭配,淡色的世界杯相关物品,起到了非常好的气氛渲染效果. 硬气的文字设计,漂亮的文字排版,与动态的球员相呼应的倾斜版式,加上动感的配图造型,加上有活力的配色,让整个画面颇具动感. 选图很有张力,场景模拟加虚实处理交互性很强的JS特效,让人

UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)

1. ckfinder(ckfinder插件标签) 1.1. 参数 属性名 类型 描述 是否必须 默认值 name string 属性名称 是 null value string 默认值 否 null width string 显示图片宽(上传类型为Images时) 否 null height string 显示图片高(上传类型为Images时) 否 null buttonClass string 按钮样式 否 null buttonValue string 按钮文本 否 null upload