邻接表详解

简介: 邻接表详解




邻接表图解:看上图(左)


8  9                       有向图:这是左图的连接方式看右图就是建表后,表的样子就是  1 开头的  后面写  2 3

1  3  2                   2 开头的后写4  5   一次类推
1  2  1                   无向图: 就是1 后  2  3  ,  2  后   1   4  5  因为无向吗所以  1  2  也可以看做  2   1  
2  4  3
2  5  1
3  6  2
3  7  6
4  8  6
5  8  3
6  7  2




#include<cstdio>
#include<cstring>
#define maxn 100+10
#define maxm 20000+10
struct Edge
{
  int from,to,val,next;
};//from 起点,to终点,val权值,next就是指向下一个边
Edge  edge[maxm];  //  边数的数组要比都节点数大
int head[maxn],edgenum;// head数组和edgenum就是记录与一个头结点相连的结点的个数
int n,m;
void addEdge(int u,int v,int w)  //w 是权值
{
  Edge E={u,v,w,head[u]}; //  输入的数据存入结构体
  edge[edgenum]=E;       //  edge[]  数据存每组数据
  head[u]=edgenum++     //   这里就是记录一个头结点所连的尾结点个数
}
void init()
{
  edgenum=0;
  memset(head,-1,sizeof(head));
}
void getMap()
{
  int a,b,c;
  while(m--)
  {
    scanf("%d%d%d",&a,&b,&c);
          addEdge(a,b,c);
          addEdge(b,a,c);
  }
}
void get_map() //  这里写一个输出链表的函数  方便理解链表的结构和怎样调用链表中的数据  
{
  for(int u=1;u<=n;u++) // 控制每个头结点
  {
     printf("%d: ",u);// 输出头结点
     for(int i=head[u];i!=-1;i=edge[i].next)//  控制每条链
      printf("%d ",edge[i].to);// 这里输出  (输出什么看题而定)
     printf("\n");
  }
}// 记住上边这个函数就可以随意调用链表中的任何一项数据
int main()
{
  while(scanf("%d%d",&n,&m),n||m)
  {
    init();
    getMap();
    printf("\n");
    get_map();
  }
  return 0;
}



这就是建表和输出表 (这里用的是结构体数组存储 ,不太喜欢用指针存)

测试结果:

8 9

1 3 2

1 2 1

2 4 3

2 5 1

3 6 2

3 7 6

4 8 6

5 8 3

6 7 2


1: 2  3

2: 5 4 1

3: 7 6 1

4: 8 2

5: 8 2

6: 7 3

7: 6 3

8: 5 4

再回看上右图怎么惊人的相似!哈哈这就是邻接表

但是怎么用呢其实也很简单,就是在求最短路径等与图论相关的题用的比较多

这里给一个求最短路的题     hdu-2544-最短路径







目录
相关文章
|
缓存 网络协议 数据安全/隐私保护
[运维笔记] - (命令).Windows server常用网络相关命令总结
[运维笔记] - (命令).Windows server常用网络相关命令总结
658 0
|
存储 安全 Java
学成在线笔记+踩坑(12)——用户认证
连接用户中心数据库、账号密码认证、验证码认证
学成在线笔记+踩坑(12)——用户认证
|
安全
选择最佳供应商:ERP系统的供应商选择与评估方法论
选择最佳供应商:ERP系统的供应商选择与评估方法论
1515 0
|
存储 自然语言处理 PyTorch
Transformers 4.37 中文文档(九十五)(1)
Transformers 4.37 中文文档(九十五)
168 1
|
人工智能 运维 自然语言处理
当Linux遇上AI:探索操作系统中的智能新纪元
阿里云的OS Copilot是专为Linux打造的智能助手,利用大模型提供自然语言交互、命令辅助及运维优化。它简化编程任务,生成脚本框架,提供代码审查建议,适合开发者和运维人员。
1792 0
当Linux遇上AI:探索操作系统中的智能新纪元
|
机器学习/深度学习 监控 自动驾驶
探索深度学习在图像识别中的应用
本文旨在深入探讨深度学习技术如何革新图像识别领域,通过分析卷积神经网络(CNN)的工作原理及其在图像处理中的优势,揭示深度学习模型如何超越传统算法,提升识别准确率。文章将介绍深度学习在自动驾驶、医疗诊断和安全监控等实际应用场景中的成功案例,并讨论当前面临的挑战与未来的发展趋势。
|
监控 项目管理
精益求精:ERP系统的项目管理与团队协作
精益求精:ERP系统的项目管理与团队协作
541 0
|
Prometheus 监控 数据可视化
配置grafana的具体情况
配置grafana的具体情况
186 2
|
存储 负载均衡 分布式数据库
HBase的数据分布是如何进行的?
HBase的数据分布是如何进行的?
360 0
虾皮二面:Spring Bean 默认是单例的,如何保证并发安全?
Spring 的 Bean 默认都是单例的,某些情况下,单例是并发不安全的,以 Controller 举例,问题根源在于,我们可能会在 Controller 中定义成员变量,如此一来,多个请求来临,进入的都是同一个单例的 Controller 对象,并对此成员变量的值进行修改操作,因此会互相影响,无法达到并发安全(不同于线程隔离的概念,后面会解释到)的效果。 首先来举个例子,证明单例的并发不安全性: