最短路径算法之五——邻接表

邻接表

  邻接矩阵来存储图的信息相对于非完全图,会浪费大量的空间,同时在求最短路径的时候也会有多余的计算浪费时间。

  使用邻接表可以节约这些浪费的时间。

  这里介绍的是用数组模拟的邻接表:

  定义begin[MAXN],end[MAXN],dis[MAXN],first[MAXN],next[MAXN]五个数组。

  例子描述如下:

    4 5

    1 4 9

    4 3 8

    1 2 5

    2 4 6

    1 3 7

Step1:


1


2


3


4


5


begin


end


dis


first


-1


-1


-1


-1


-1


next

Step2:


1


2


3


4


5


begin


1


end


4


dis


9


first


1


-1


-1


-1


-1


next


-1

Step3:


1


2


3


4


5


begin


1


4


end


4


3


dis


9


8


first


1


-1


-1


2


-1


next


-1


-1

Step4:


1


2


3


4


5


begin


1


4


1


end


4


3


2


dis


9


8


5


first


3


-1


-1


2


-1


next


-1


-1


1

Step5:


1


2


3


4


5


begin


1


4


1


2


end


4


3


2


4


dis


9


8


5


6


first


3


4


-1


2


-1


next


-1


-1


1


-1

Step6:


1


2


3


4


5


begin


1


4


1


2


1


end


4


3


2


4


3


dis


9


8


5


6


7


first


5


4


-1


2


-1


next


-1


-1


1


-1


3

创建邻接表:

 1 nt n,m,i;
 2 int begin[6],end[6],dis[6];
 3 int first[6],next[6];
 4 scanf("%d %d",&n,&m);
 5 //初始化first数组
 6 for(i=1;i<=n;i++)
 7     first[i]=-1;
 8 for(i=1;i<=m;i++)
 9 {
10     scanf("%d %d %d",&begin[i],&end[i],&dis[i]);
11     next[i]=first[begin[i]];
12     first[begin[i]]=i;
13 }

遍历1号顶点所有边:

1 k=first[1];
2 while(k!=-1)
3 {
4     printf("%d %d %d\n",begin[k],end[k],dis[k]);
5     k=next[k];
6 }

最短路径算法之五——邻接表

时间: 2024-10-11 12:26:36

最短路径算法之五——邻接表的相关文章

POJ 2387 Til the Cows Come Home dijkstra算法 用邻接表和邻接矩阵

题目如下: Til the Cows Come Home Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 27726        Accepted: 9353 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wa

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一.前言 最短路径算法,顾名思义就是求解某点到某点的最短的距离.消耗.费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离.比方说,我们把地图上的每一个城市想象成一个点,从一个城市到另一个城市的花费是不一样的.现在我们要从上海去往北京,需要考虑的是找到一条路线,使得从上海到北京的花费最小.有人可能首先会想到,飞机直达啊,这当然是时间消耗最小的方法,但是考虑到费用的高昂,这条线路甚至还不如上海到北京的高铁可取.更有甚者,假设国家开通了从上海到西藏,再从西藏到兰州

【HDU 1874 2544 2066 2112】 Dijkstra单源最短路径专题 —— 优先队列+邻接表/邻接矩阵

HDU 1874  畅通工程续 解题报告: 由于顶点(城镇)的数目只有200个,所以可以采用邻接矩阵的形式来存储,代码会更简洁些,也不容易出错.但是处于练习的目的,采用邻接表+优先队列的方式实现,优先队列使用STL中的priority_queue.很基础的单源单汇最短路径. HDU 2544  最短路 解题报告: 基本和1874是一样的,只是数据量小了,并且要求当n==0 && m==0时终止,值得注意!这道题同时也保证了一定是可达的,所以输出时可以直接输出. HDU 2066  一个人的

图基本算法 最小生成树 Prim算法(邻接表+优先队列STL)

这篇文章是对<算法导论>上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法. 最小生成树的具体问题可以用下面的语言阐述: 输入:一个无向带权图G=(V,E),对于每一条边(u, v)属于E,都有一个权值w. 输出:这个图的最小生成树,即一棵连接所有顶点的树,且这棵树中的边的权值的和最小. 举例如下,求下图的最小生成树: 这个问题是求解一个最优解的过程.那么怎样才算最优呢? 首先我们考虑最优子结构:如果一个问题的最优解中包含了子问题的最优解,则该问题具有最优子结构. 最小

hrbust1339 Touring (Dijkstra最短路径)(邻接表)

本文出自:http://blog.csdn.net/svitter 题意:两个人从c出发,分别想去a,b旅行,两个城市之间只有一条路,有一个相应的价值.求最小的价值.通行的时候只花费一个价值. 本题目的关键在于优先队列,求出a, b, c到各点的最小价值,然后从中挑选一个点作为分开的点. dijktra算法时用邻接表存储,因为明显是稀疏图..还有就是存边的时候记得存双向的边,利用优先队列弹出最小的花费.使用邻接表记得初始化node[i] = -1(可以用memset) AC: //=======

设计一个算法,输出从u到v的所有最短路径(采用邻接表存储)

思想:用path数组存放路径(初始为空),d表示路径长度(初始为-1),查找从顶点u到v的最短路径过程如图所示: 对应算法如下: void FindPath(AGraph *G,int u,int v,int path[ ],int d) { int w,i; ArcNode *p; d++; path[d]=u; visited[u]=1; //路径长度增1 if(u==v) { for(i=0;i<=d;i++) printf("%2d",path[i]); printf(&

邻接表转邻接矩阵

假设无向图G采用邻接矩阵存储,编写一个算法输出邻接表. Description 第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),接下来是为一个n*n大小的整数矩阵,表示图的邻接关系.数字为0表示不邻接,1表示邻接. Input 输出图G的邻接表.第一行表示顶点0可直接到达的顶点编号.其他行定义相同. Output 1 2 3 4 5 6 5 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 Sample Input 1 2 3 4 5

The Postal Worker Rings Once(UVA 117)最短路径—SPFA算法+邻接表

The Postal Worker Rings Once From:UVA, 117 Time Limit: 3000 MS Background Graph algorithms form a very important part of computer science and have a lineage that goes back at least to Euler and the famous Seven Bridges of K?nigsberg problem. Many opt

设计一个算法,採用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G採用邻接表存储)

思想:图G是不带权的无向连通图.一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列.利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地向外扩展,当第一次找到顶点v时队列中便包括了从顶点u到顶点v近期的路径,如图所看到的,再利用队列输出最路径(逆路径),所以设计成非循环队列. 相应算法例如以下: typedef struct  { int data;//顶点编号 int parent;//前一个顶点的位置 } QUEUE;//非循环