采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。
采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。
- 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。
- 设计算法,将一个无向图的邻接矩阵转换为邻接表。
采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。
设计步骤:
1.建立图
2.利用深度优先遍历,寻找两个结点
代码:
#define max 100 //顶点的最大个数
typedef struct st1//定义邻接表中结点类型
{int adjvex; // 邻接点的位置struct st1 *nextarc; //指向下一个结点char info; //边的信息
} Arcnode;//定义邻接表中头结点类型
typedef struct
{//顶点信息char vexdata;//指向第一个邻接结点Arcnode *firstarc;
} AdjList;
typedef struct
{//定义邻接表表头AdjList vextices[max];//存放表头结点信息 int vexnum, arcnum; //有向图的顶点数和边数
} AIGraph;
int visited[max];//定义深度优先搜索遍历数组,0表示未被访问过,1表示已被访问过
int flag = 0;//定义全局标志变量,用来确定两点间是否为通路,1表示存在,0表示不存在建立邻接表
AIGraph *create_AdjListGraph()
{int n, e, i, j, k;Arcnode *p;AIGraph *al;al = (AIGraph *)malloc(sizeof(AIGraph));printf("请输入结点数:");scanf("%d", &n);//初始化表头结点数组for (i = 1; i <= n; i++){al->vextices[i].vexdata = (char)i; //数据域存放顶点序号al->vextices[i].firstarc = NULL;}printf("请输入边数:");scanf("%d", &e);printf("请输入弧的信息:");for (i = 0; i < e; i++){scanf("%d %d", &j, &k); // 依次读入弧的信息,结点k为结点j的邻接点p = (Arcnode *)malloc(sizeof(Arcnode)); //申请结点空间,分配结点p->adjvex=k;p->info = ' ';p->nextarc = al->vextices[j].firstarc;al->vextices[j].firstarc = p;}al->vexnum = n;al->arcnum = e;return al;
}
void print(AIGraph *alg) //输出邻接表
{int i;Arcnode *p;printf("图的邻接表为:\n");for (i = 1; i <= alg->vexnum; i++){printf("\t%d-", alg->vextices[i].vexdata);p = alg->vextices[i].firstarc;while (p != NULL){printf("%d-", p->adjvex);p = p->nextarc;}printf("<\n");}
}//符号“<”表示空结点释放邻接表结点空间
void FreeAlGraph(AIGraph *alg)
{int i;Arcnode *p, *q;for (i = 0; i <= alg->vexnum; i++){p = alg->vextices[i].firstarc;while (p != NULL){q = p->nextarc;free(p);p = q;}}
}
int dfs(AIGraph *alg, int i, int n) //深度优先搜索遍历算法
{Arcnode *p;visited[i] = 1; //标志已被访问p = alg->vextices[i].firstarc;while (p != NULL){if (visited[p->adjvex] == 0){if (p->adjvex == n){flag = 1;}dfs(alg, p->adjvex, n); //访问未被访问过的结点if (flag == 1)return 1;}p = p->nextarc;} //搜索下一个邻接点return 0;
}
void dfs_trave(AIGraph *alg, int m, int n)
{int i;for (i = 0; i <= alg->vexnum; i++)visited[i] = 0;// 初始化访问数组dfs(alg, m, n);
}
int main()
{int m, n;//需要判断有无通路的两个结点AIGraph *alg;alg = create_AdjListGraph();print(alg); //输出链接表do{printf("请输入任意两个顶点(输入两个-1退出):");scanf("%d %d", &m, &n);dfs_trave(alg, m, n);printf("\n");if (flag == 1)printf("顶点%d到%d存在通路\n", m, n);elseprintf("顶点%d到%d不存在通路\n", m, n);flag = 0;printf("ln");} while (m != -1 && n != -1);FreeAlGraph(alg);//释放结点空间return 0;
}
设计算法,将一个无向图的邻接矩阵转换为邻接表。
设计步骤:
1.分别定义邻接矩阵和邻接图
2.查看邻接矩阵中的数据,如果为一则放入邻接图中
3.数据类型:
#define MAXV 100
//以下定义邻接矩阵类型
typedef struct
{int vexs[MAXV];int arcs[MAXV][MAXV];int vexnum, arcnum;
} MGraph;
//以下定义邻接表类型
typedef struct ANode
{int adjvex;struct ANode *nextarc;
} ArcNode;
typedef struct Vnode
{int data;ArcNode *firstarc;
} VNode;
typedef struct
{VNode vertices[MAXV];int vexnum, arcnum;
} ALGraph;
代码:
void MatToList(MGraph g, ALGraph *G)
//将邻接矩阵g转换成邻接表G
{int i, j;ArcNode *p, *s;for (i = 0; i < g.vexnum; i++)G->vertices[i].firstarc = NULL;for (i = 0; i < g.vexnum; i++)for (j = 0; j < g.vexnum; j++)if (g.arcs[i][j] != 0){p = (ArcNode *)malloc(sizeof(ArcNode));p->adjvex = j;p->nextarc = NULL;if (!G->vertices[i].firstarc)G->vertices[i].firstarc = p;else{s = G->vertices[i].firstarc;while (s->nextarc)s = s->nextarc;s->nextarc = p;}}G->vexnum = g.vexnum;G->arcnum = g.arcnum;
}
void Output(ALGraph *G)
//输出邻接表G
{int i;ArcNode *p;for (i = 0; i < G->vexnum; i++){p = G->vertices[i].firstarc;printf("v%d:", i + 1);while (p != NULL){printf("%2d", p->adjvex);p = p->nextarc;}printf("\n");}
}
int main()
{int i, j;MGraph g; //定义图的邻接矩阵ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph)); //邻接表int n, m;printf("输入图G的邻接矩阵顶点数:\n");scanf("%d", &n);printf("输入图G的邻接矩阵边数:\n");scanf("%d", &m);int A[n][n]; //邻接矩阵printf("输入图G的邻接矩阵:\n");for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){scanf("%d", &A[i][j]);}}g.vexnum = n;for (i = 0; i < g.vexnum; i++)for (j = 0; j < g.vexnum; j++)g.arcs[i][j] = A[i][j];printf("图G的邻接矩阵转换成邻接表:\n");MatToList(g, G);Output(G);return 0;
}
采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。相关推荐
- C语言:将邻接矩阵转换为邻接表算法
题目 设计一个将邻接矩阵转换为邻接表的算法: 分析 在图 G 中的邻接矩阵 G 中查找值不为 0,不为∞的元素,若找到这样的元素.例如,G.edges[i][j],表示存在一条边,创建一个 adjve ...
- 查找有向图中两个顶点之间是否存在路径
查找有向图中两个顶点之间是否存在路径 给定一个有向图和其中的两个顶点,检查是否存在从第一个给定顶点到第二个顶点的路径. Consider the following Graph:Input : (u, ...
- 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径
问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...
- 算法导论之每对顶点间的最短路径
从单源顶点最短路径到每对顶点间最短路径,求解的问题从一个点扩展到所有点,描述如下:给定一个加权有向图G=(V,E),其加权函数w:E->R为边到实数权值的映射,对于每对顶点u,v∈V,找出从u到 ...
- 图的所有顶点间的最短路径(Floyd算法)
问题描述 对每一对顶点vi ≠ vj,求出vi与vj之间的最短路径和最短路径长度 Floyd算法 Floyd(Floyd-Warshall)算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中 ...
- 弗洛伊德算法(求每一对顶点间的最短路径)
每一对顶点间的最短路径 求解每一对顶点间的最短路径有两种方法:其一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法:其二是采用下面介绍的弗洛伊德算法.这两种算法的时间复杂度均为O(n^3),但后者 ...
- 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径
#include <iostream> #include <string> #include <iomanip> using namespace std; #def ...
- 有向图,无向图的邻接矩阵和邻接表模板
图 图的定义 有向图 概念 模板 邻接矩阵 邻接表 无向图 概念 模板 邻接矩阵 邻接表 简单图 完全图 图的定义 图 GGG 由顶点集 VVV 和边集 EEE 组成,记为 G=(V,E)G=(V,E ...
- python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...
graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C','G','H'], 'E': ['F'], 'F': ['C']} # ...
最新文章
- webView 显示一段 html 代码
- mysql 数据类_MySQL数据类型
- 那个名为 XROS 的操作系统,倒在了元宇宙浪潮中!
- sklearn 特征降维利器 —— PCA TSNE
- Centos-显示文件类型-file
- 在线考试系统设计+源码
- 电子通信协议之CAN总线协议篇
- volatile详解
- 简仿Path的商店表情弹出模块
- win10录屏电流声_电脑录屏出现杂音?可能是这几种原因
- 把JRuby Rails应用部署在Java应用服务器上
- 八戒帮扶V5微信公众平台任务系统完美运营v1.5.8
- 【观察】加速IPFS基础设施落地,西部数据的三重独特优势
- ROS-talker,listener
- 工作中遇到的问题合集
- Android开发实战《手机安全卫士》——11.“进程管理”模块拓展 窗体小部件 生成快捷方式
- 12步解N-S方程之第二步
- SFTP获取文件夹内的文件名,文件大小,文件修改时间
- 常用自媒体工具网站大全,收集整理32个工具分享!
- Android获取网络图片的宽高
热门文章
- 华为 ACL访问控制列表 (高级ACL为例)
- Spring Cloud Feign启动Load balancer does not have available server for client分析
- 2679 Adventurous Driving 解题报告
- gdb反汇编disassemble
- Hbase分析报告(转载)
- AList软件的使用--已经直接在win上进行磁盘映射--修改数据源为mysql
- 【产业互联网周报】寒武纪IPO过会;中芯国际刷新科创板IPO速度,但恐不能为华为代工;国家网信办等8部门集中整治网络直播行业...
- EasyExcel导出数据超过Excel单表上限时进行分表
- UIImage图形放大或缩小
- 关于BBSXP 7.00 BETA2 SQL通杀教程