邻接表

别来无恙 提交于 2019-12-15 10:45:23
图: 如何存储微博、微信等这些社交网络的好友关系? 为什么产生? 特点? 使用场景? 树中的元素称为节点,图中的元素称为顶点。顶点之间的关系叫作边。顶点相连接的边的条数叫作定点的度。 微信为例: 一个用户就是一个顶点,好友关系就是边,一个用户总的好友个数就是度 微博:可以单向关注,其实现为有向图 边上增加方向的概念就是有向图,此时无向图中的度分为 入度 和 出度。 入度:多少条边指向这个定点 出度:多少条边是从这个定点指出 qq中的亲密度,经常交流,亲密度高。其实现为:带权图. 在带权图中,每条边都有一个权重(weight),我们可以通过这个权重来表示 QQ 好友间的亲密度 图的存储 邻接矩阵 无向图:顶点 i 与顶点 j 之间有边,我们就将 A[i][j] 和 A[j][i] 标记为 1; 有向图:如果顶点i到顶点j之间,有一条箭头从顶点i指向顶点j的边,那将A[i][j]标记为1;同理,如果有一条箭头从顶点j指向顶点i的边,我们就将A[j][i]标记为1。 带权图:数组中就存储相应的权重 实例如图: 缺点:浪费空间。 例如无向图,一条边存储一个就可以,即可以利用对角线划分一半出来即可 如稀疏图,几亿个定点,但是每个用户仅有数百个用户 优点:简单直观,邻接矩阵方便计算 邻接表 如图: 类似散列表。图中画的是一个有向图的邻接表存储方式,每个顶点对应的链表里面,存储的是指向的顶点。

(转载)漫画:为什么你需要了解数据结构中的图?

◇◆丶佛笑我妖孽 提交于 2019-12-12 09:52:54
原文地址: https://blog.csdn.net/csdnnews/article/details/88809812 图的概念 究竟什么是图呢?大家先来想一想咱们常用的互联网产品。 举个栗子,大家一定都用过微信,假设你的微信朋友圈中有若干好友:张三、李四、王五、赵六、七大姑、八大姨。 而你七大姑的微信号里,又有若干好友:你、八大姨、Jack、Rose。 微信中,许许多多的用户组成了一个多对多的朋友关系网,这个关系网就是数据结构当中的 图(Graph) 。 再举一个栗子,咱们在用百度地图的时候,常常会使用导航功能。比如你在地铁站A附近,你想去的地点在地铁站F附近,那么导航会告诉你一个最佳的地铁线路换乘方案。 这许许多多地铁站所组成的交通网络,也可以认为是数据结构当中的图。 图,是一种比树更为复杂的数据结构。树的节点之间是 一对多 的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是 多对多 的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。 图的术语 下面我们来介绍一下图的基本术语: 在图中,最基本的单元是 顶点(vertex) ,相当于树中的节点。顶点之间的关联关系,被称为 边(edge) 。 在有些图中,每一条边并不是完全等同的。比如刚才地铁线路的例子,从A站到B站的距离是3公里,从B站到C站的距离是5公里......这样就引入一个新概念:边的 权重

7-4 邻接表创建无向图 (20分)

半城伤御伤魂 提交于 2019-12-11 03:10:44
7-4 邻接表创建无向图 (20分) 采用邻接表创建无向图G ,依次输出各顶点的度。 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。 输入第二行为顶点的信息,每个顶点只能用一个字符表示。 依次输入j行,每行输入一条边依附的顶点。 输出格式: 依次输出各顶点的度,行末没有最后的空格。 输入样例: 5 7 ABCDE AB AD BC BE CD CE DE 输出样例: 2 3 3 3 3 #include<stdlib.h> #include<iostream> using namespace std; struct edge { char frontEdge ; char lastEdge ; }; #define max 10 int main() { int I, J; cin >> I >> J; char vertices[max]; int verticesDegree[max] = { 0 }; edge edges[50]; for (int i = 0; i < I; i++) { cin >> vertices[i]; } for (int j = 0; j < J; j++) { char A,B; cin >> A >> B; edges[j].frontEdge = A; edges[j].lastEdge

tu

点点圈 提交于 2019-12-10 20:57:52
1 第五章 图 2 //结构定义 3 #define MaxVertexNum 100 //图中顶点数目的最大值 4 typedef struct ArcNode{ //边表节点 5 int adjvex; //该弧所指向的结点的位置 6 struct ArcNode *nextarc; //指向下一条边的指针 7 //InfoType info ; //网的边权值 8 }ArcNode; 9 10 typedef struct VNode{ //顶点表结点 11 VertexType data; //顶点信息 12 ArcNode *firstarc; //指向第一条依附该顶点的弧的指针 13 }VNode,AdjList[MaxVertexNum]; 14 15 typedef struct{ 16 AdjList vertices; //邻接表 17 int vexnum, arcnum; //图的顶点数和弧数 18 }ALGraph; //ALGraph是以邻接表存储的图类型 19 20 21 22 23 24 例1、已知G为邻接矩阵存储,请设计一个算法将其转换为 邻接表存储 25 void MatrixToAdj(int A[]) 26 { 27 //初始化顶点表 28 for (int i=0;i<vertices;i++) //vertices 图中顶点数 29 {

邻接表的创建及应用

狂风中的少年 提交于 2019-12-06 14:33:44
#include<stdio.h> #include<stdlib.h> #define MAX 20 typedef char vextype; //边 typedef struct node{ //定义边结点的类型 int adjver; //边的邻接点的数据(顶点的序号) struct node *next; //指向本边下一邻接点的指针 }edgeNode; //顶点 typedef struct { //定义顶点的类型 vextype vertex; //顶点的数据 edgeNode *link; //指向本边邻接表 }verNode; //图 typedef struct { verNode adjlist[MAX]; int n,e; //n-顶点数,e-边数 }link_graph; //创建无向图 void CreateGraph(link_graph &g) { printf("--------------图的创建开始------------\n"); printf("输入顶点的个数及边的个数:\n"); scanf("%d%d",&g.n,&g.e); for(int i=0;i<g.n;i++) { g.adjlist[i].vertex = (char)(i+65);//顶点赋值 g.adjlist[i].link = NULL; //初始化link }

递归法dfs以邻接表表示的无向无权图

余生长醉 提交于 2019-12-06 07:03:25
  上图:   上码: 1 // vs 2015 2 // 邻接表 无向不带权 3 4 5 #include <iostream> 6 #include <stack> 7 8 using namespace std; 9 #define MAX 10 10 11 typedef int ElemType; //结点被标记的类型 12 //弧结点 13 typedef struct ArcNode { 14 ElemType name; //与顶点相连的弧name 15 struct ArcNode *next; //下一个兄弟弧 16 } ArcNode; 17 //顶点信息 18 typedef struct VNode { 19 ElemType name; //顶点被标记名字 20 ArcNode * firstarc; //顶点连接的第一条弧(左右不敏感) 21 } VNode, AdjList[MAX]; 22 //邻接表 23 typedef struct { 24 AdjList vertinfo; //hash表 25 int vexnum; //顶点数 26 int arcnum; //弧数 27 } AdjGraph; 28 29 30 int visited[MAX]; 31 void dfs_byecursion(AdjGraph G, ElemType

图的存储:邻接表

China☆狼群 提交于 2019-12-06 04:48:09
数据结构: 1 typedef struct ArcNode{ 2 int adjvex; //该弧所指向的顶点位置 3 struct ArcNode* next; //指向下一条弧的指针 4 } ArcNode; 5 6 typedef struct VNode { 7 int data; //顶点信息,标号,int类型 8 ArcNode* first; //指向第一条关联弧 9 } VNode, AdjList[MAX_VERTEX_NUM]; 10 11 typedef struct { 12 AdjList vertices; //邻接表 13 int vexnum, arcnum; //顶点和弧的个数 14 }AdjListGraph; 上图顶点集: 举例: 将邻接表示的图转为邻接矩阵(无向无权图) 1 #include <iostream> 2 using namespace std; 3 4 #define MAX_VERTEX_NUM 10 //最大顶点数 5 #define MAX_ARCNODE_NUM 10 //最大边数 6 7 typedef struct ArcNode{ 8 int adjvex; //该弧所指向的顶点位置 9 struct ArcNode* next; //指向下一条弧的指针 10 } ArcNode; 11 typedef

采用邻接表表示法创建无向图

与世无争的帅哥 提交于 2019-12-04 18:32:39
//采用邻接表表示法创建无向图 #include <iostream> using namespace std; #define MVNnm 100 #define OK 1 typedef char VerTexType; typedef int OtherInfo; typedef struct ArcNode { int adjvex; struct ArcNode* nextarc; OtherInfo info; }ArcNode; typedef struct VNode { VerTexType data; ArcNode* firstarc; }VNode, adjList[MVNnm]; typedef struct { adjList vertices; int vexnum, arcnum; }ALGraph; int LocateVex(ALGraph G, VerTexType v) { for (int i = 0;i < G.vexnum;++i) { if (G.vertices[i].data == v) { return i; } } return -1; } int CreatUDG(ALGraph& G) { int i, k; cout << "请输入总顶点数,总边数中间以空格隔开:"; cin >> G.vexnum >> G

采用邻接表表示图的深度优先搜索遍历

ⅰ亾dé卋堺 提交于 2019-12-04 18:32:27
//采用邻接表表示图的深度优先搜索遍历 #include <iostream> using namespace std; #define MVNum 100 typedef char VerTexType; typedef char VerTexType; typedef struct ArcNode { int adjvex; struct ArcNode* nextarc; }ArcNode; typedef struct VNode { VerTexType data; ArcNode* firstarc; }VNode, AdjList[MVNum]; typedef struct { AdjList vertices; int vexnum, arcnum; }ALGraph; bool visited[MVNum]; int LocateVex(ALGraph G, VerTexType v) { for (int i = 0;i < G.vexnum;++i) if (G.vertices[i].data == v) return i; return -1; } void CreateUDG(ALGraph& G) { int i, k; cout << "请输入总顶点数,总边数,以空格隔开:"; cin >> G.vexnum >> G.arcnum; cout <

链前/邻接表--模板/货车运输

我的梦境 提交于 2019-12-04 14:18:09
一部分链前代码 to:当前节点所连接的下一个节点 nxt:当前节点所连的下一条边 head:当前节点所连接的第一个边 还不是很理解,先把板子写好,慢慢在看把 1 #include <cstdio> 3 #include <iostream> 4 using namespace std; 5 int const N=1e4; 6 int cnt,head[N],to[N],nxt[N]; 7 void addedge(int u,int v) 8 { 9 nxt[++cnt]=head[u]; 10 to[cnt]=v; 11 head[u]=cnt; 12 return; 13 } 14 int st,ed; 15 for (int i = head[st];i != 0;i = head[i]) 16 {//遍历一个点所连接的边 17 } 关于货车运输 那就先最大生成树,来确保每一条路径上最小的值最大。邻接表记录,dfs构建树,LCA查找,害,可以说是一道很复杂的较简单的题。(划重点:很复杂的!!!简单(弱弱的)题) 题目描述 A 国有 n 座城市,编号从 1 到 n ,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。 现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。 输入格式 第一行有两个用一个空格隔开的整数