ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

邻接表和逆邻接表的构建

2022-01-28 19:31:46  阅读:179  来源: 互联网

标签:下标 邻接 -- next int 构建 outf 表和逆


一、邻接表

  1.为什么需要邻接表?

    答:当遇到的是稀疏图的情况下如果用邻接矩阵去存储的话,时间复杂度会是O(n^2),空间复杂度也会是O(n^2),其实这样是非常划不来的,因为你有很多空间没有用掉,所以就有了邻接表的存储方式

  2.邻接表是什么?

    答:可以把它当做一个链表来看待,他就是利用指向的形式寻找你的下一条边。

  3.邻接表的复杂度

     答:时间复杂度:O(n + e),空间复杂度O(e),e取决于边的数量  

  4.邻接表的作用

    答:可以较快速通过线性遍历知道某个顶点的入度和出度,这里我指的是有向图,当然无向图也可以求度

二、邻接表的构建

  给定一组数据

        // 0 1         // 3 0         // 2 0         // 4 3         // 4 2         // 1 4      开辟u,v,outf,next数组   v代表顶点,u代表该组顶点到的另一个顶点,outf代表出度第一个顶点,next代表下一个顶点(这里请注意,next里面存的是顶点的编号,就是在v数组里面的第i条数据,这是一条链,不一定只有一个)   实操开始     1初始化 (注意u、v数组的初始下标为1,next,inf数组的初始下标为0)       因为可能存在顶点为0的情况,所以我们令-1为空,首先outf是没有节点的所以应该初始化为空     2.       1.读入0-->1这条边         outf【0】更新为1,表示在v和u的1号下标存了一组关于0的出边,具体是0-->n不知道,next[0]这里是更新为-1,表示还没有下一条边       2.读入3-->0这条边         outf【3】更新为2,表示在v和u的2号下标存了一组关于3的出边,next[3]更新为-1       3.读入2-->0这条边         outf【2】更新为3,表示在v和u的3号下标存了一组关于2的出边,next[2]更新为-1       4.读入4-->3这条边         outf【4】更新为4,表示在v和u的4号下标存了一组关于4的出边,next[4]更新为-1       5.读入4-->2这条边         outf【4】更新为5,表示在v和u的5号下标存了一组关于4的出边,next[5]更新为4       6.读入1-->4这条边         outf【1】更新为6,表示在v和u的6号下标存了一组关于1的出边,next[1]更新为-1     处理后的图表为       

 三、逆邻接表

  逆邻接表的思路和邻接表的思录一样,逆邻接表是用来求某个点的入度,而邻接表是求某个点的出度问题。

四、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int inf[110],outf[110];
 4 int inext[110],outnext[110];//in代表入度,out代表出度
 5 int v[110],u[110];
 6 int main()
 7 {
 8     for(int i = 1;i <= 100;i++)
 9         inf[i] = -1,outf[i] = -1;
10     int n,m;
11     cin >> n >> m;//n是顶点数,m是边数
12     int vi,ui;
13     for(int i = 1;i <= m;i++){
14         cin >> v[i] >> u[i];//vi-->ui是出度,ui-->vi是入度
15         outnext[i] = outf[v[i]];//outf建立的是邻接表
16         outf[v[i]] = i;
17         inext[i] = inf[u[i]];//inf建立的是逆邻接表
18         inf[u[i]] = i;
19     }
20     for(int i = 1;i <= n;i++){
21         int ink,outk;
22         ink = inf[i];
23         outk = outf[i];
24         if(ink != -1)
25             cout << u[ink] << "\nin:" << endl;
26         //以第i号节点为入度的边为
27         while(ink != -1){
28             cout << v[ink] << "-->" << u[ink] << endl;
29             ink = inext[ink];
30         }
31         if(outk != -1)
32             cout << "out:" << endl;
33         //以第i号节点为出度的边为
34         while(outk != -1){
35             cout << v[outk] << "-->" << u[outk] << endl;
36             outk = outnext[outk];
37         }
38         cout << "\n\n";
39     }
40     return 0;
41 }

标签:下标,邻接,--,next,int,构建,outf,表和逆
来源: https://www.cnblogs.com/scannerkk/p/15853619.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有