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

邻接表

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

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

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

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

  PS:first[]数组与顶点个数相同,next[]数组与边的个数相同。

  例子描述如下:

    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
",begin[k],end[k],dis[k]);
5     k=next[k];
6 }

 

 部分图片文字摘自于啊哈磊的blog。

 

原文地址:https://www.cnblogs.com/Enumz/p/3862969.html