邻接表
邻接矩阵来存储图的信息相对于非完全图,会浪费大量的空间,同时在求最短路径的时候也会有多余的计算浪费时间。
使用邻接表可以节约这些浪费的时间。
这里介绍的是用数组模拟的邻接表:
定义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