最短路---dijsktra--邻接矩阵

 1 const int  MAXINT = 32767;
 2 const int MAXNUM = 10;                     //点的个数
 3 int dist[MAXNUM];
 4 int prev[MAXNUM];
 5
 6 int A[MAXUNM][MAXNUM];
 7
 8 void Dijkstra(int v0)
 9 {
10     bool S[MAXNUM];                                  // 新建一个标记数组,判断是否已存入该点到S集合中;
11       int n=MAXNUM;
12     for(int i=1; i<=n; ++i)
13     {
14         dist[i] = A[v0][i];                           //将该点的邻接矩阵复制到dist[]一维数组中;
15         S[i] = false;                                // 初始都未用过该点;
16         if(dist[i] == MAXINT)
17               prev[i] = -1;
18         else
19               prev[i] = v0;                          //记录该点的上一节点是现在处理的源点,如果不联通为-1;
20      }
21      dist[v0] = 0;                                   //dist表示原点v0到该点的最短距离;
22      S[v0] = true;                                  //将源点标记为已经访问;
23     for(int i=2; i<=n; i++)                         //循环n-1次,保证找到每一个点;
24     {
25          int mindist = MAXINT;                      //标记当前的最小距离,初始化为最大;
26          int u = v0;                               // 找出当前未使用的点j的dist[j]最小值
27          for(int j=1; j<=n; ++j)
28             if((!S[j]) && dist[j]<mindist)
29             {
30                   u = j;                             // u保存当前邻接点中距离最小的点的号码
31                   mindist = dist[j];
32             }                                       //找出了距离该源点最近的那个点,u记录了点的编号;
33          S[u] = true;
34          for(int j=1; j<=n; j++)
35              if((!S[j]) && A[u][j]<MAXINT)           //找没有被使用过的点,且与u是联通的点;
36              {
37                  if(dist[u] + A[u][j] < dist[j])     //在通过新加入的u点路径找到离v0点更短的路径 ;(如果该点距离原点的距离比从u点过度过来的距离长,则当前的最短路就改变)
38                  {
39                      dist[j] = dist[u] + A[u][j];    //更新dist
40                      prev[j] = u;                    //记录前驱顶点
41                   }
42               }
43      }
44 }

时间: 2024-11-06 01:50:11

最短路---dijsktra--邻接矩阵的相关文章

Hdu-2112 HDU Today (单源多点最短路——Dijsktra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给你N个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离.(起点终点相同距离为0)不能到达输出-1. 说真的开始看到这个题,我想利用数字标记那些地名,再利用dijsktra算法,但不知道如何用代码实现,后来在网上看博客 才知道有这样一个头文件#include<map>,map 映射,可以有这种效果,那么这题也就so easy!了, 我的AC代码 #include&l

07-图4 哈利&#183;波特的考试(25 分)多源最短路,邻接矩阵

哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫.另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠.老鼠变鱼的魔咒连起来念:hahahehe. 现在哈利·波特的手里有一本教材,里面列出了所有的变形魔咒和能变的动物.老师允许他自己带一只动物去考场,要考察他把这只动物变成任意一只指定动物的本事

POJ3613 Cow Relays 最短路+矩阵乘法

题意:求恰好经过K条边的最短路 题解:根据Floyd的性质,如果我拿一开始给出的两个边权矩阵(只经过一条边的最短路的邻接矩阵)跑Floyd,得到的一定是只经过两条边的最短路的邻接矩阵(普通的Floyd是用求出的最短路来更新最短路而非用初始矩阵),同理用两条边的邻接矩阵一定能得到四条边的,因此N条边的邻接矩阵一定能由N/2条边的邻接矩阵得到,而当N为奇数时,用N-1的和初始矩阵跑一边就好了.因此套用矩阵乘法和快速幂的思想,就能把复杂度压倒N^2logN. #include <cstdio> #i

地铁出行项目(续)

地铁出行项目(续) 团队成员:(特殊三人组) 杨金键 谢振威 金豪 有图有真相: 结对编程: 优点: 结对编程的时候可以一起工作,有什么错误立马发现,降低错误的概率,同时也是极好的交流学习的机会 所有人都可以专注于不同的方面,在坐一起写代码之外,如果要学新的知识,也可以分配下去各自攻克各自的任务然后再交流,这样的工作效率远比一个人要高 可以相互学习,相互借鉴,队伍里每个人都各有特点,各有所长,交流的时候进步很快 多人协作可以相互鼓励,相互督促,不容易被诱惑分心. 缺点: 分工交集的部分如果沟通不

【BZOJ2459】 [BeiJing2011]神秘好人

Description 有一个神秘好人跟Bdcxq玩一个游戏,如果Bdcxq成功完成了这个游戏,那么他将会得到一件礼物. 这个游戏是这样的: 有一个梯子形的图如下,每条边都有一个权值. 神秘好人一开始会告诉Bdcxq每条边的权值. 然后神秘好人会做这样的事情: 1.神秘好人会修改某条边的权值: 2.神秘老人会问你从一个点走到另一个点所需经过边权和最小的权值和. 如果Bdcxq一直能答对问题,那么他就完成了游戏,也能得到礼物. 现在他请你编一个程序来帮他完成游戏. Input 输入文件的第一行包含

bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑【矩阵乘法+Floyd】

唔不知道怎么说--大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注意重载乘号的部分,注意到这样乘一次就相当于把本来存了经过k条路的最短路的邻接矩阵变成存了经过k+1条路的最短路的邻接矩阵 这样看来乘n次就行了,这里用矩阵快速幂 妙啊 #include<iostream> #include<cstdio> using namespace std; co

4003.基于Dijsktra算法的最短路径求解

基于Dijsktra算法的最短路径求解 发布时间: 2018年11月26日 10:14   时间限制: 1000ms   内存限制: 128M 有趣的最短路...火候欠佳,目前还很难快速盲打出来,需继续练习.唉....我这暑假都干了些啥orz.(马上考四级,练习一下我蹩脚的英语,各位莫笑侬) 描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径. 输入 多组数据,每组数据有m+3行.

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 邻接矩阵实现的单源最短路 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include

20151230训练题解(最短路+拓扑排序)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103223#problem/B 这道题用经典的dijsktra算法,大概思路就是用dist[x]存储x到已经确定集合的最短路,n次循环到这个这个最小值,然后更新其他点到新集合的最短路即对应的dist[] 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <al