采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。

  • 采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。
  • 设计算法,将一个无向图的邻接矩阵转换为邻接表。

采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。

设计步骤:
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;
}

采用邻接表存储有向图,设计算法判断任意两个顶点间是否存在路径。设计算法,将一个无向图的邻接矩阵转换为邻接表。相关推荐

  1. C语言:将邻接矩阵转换为邻接表算法

    题目 设计一个将邻接矩阵转换为邻接表的算法: 分析 在图 G 中的邻接矩阵 G 中查找值不为 0,不为∞的元素,若找到这样的元素.例如,G.edges[i][j],表示存在一条边,创建一个 adjve ...

  2. 查找有向图中两个顶点之间是否存在路径

    查找有向图中两个顶点之间是否存在路径 给定一个有向图和其中的两个顶点,检查是否存在从第一个给定顶点到第二个顶点的路径. Consider the following Graph:Input : (u, ...

  3. 基于广度优先遍历算法求采用邻接表存储的无向连通图G中从顶点u到v的最短路径

    问题 假设图G采用邻接表存储,设计一个算法,求不带权无向连通图G中从顶点u->v的最短路径(路径上经过的顶点数最少.采用广度优先遍历来实现. 基本思路 我们首先来看一下BFS的过程: 图片摘自慕 ...

  4. 算法导论之每对顶点间的最短路径

    从单源顶点最短路径到每对顶点间最短路径,求解的问题从一个点扩展到所有点,描述如下:给定一个加权有向图G=(V,E),其加权函数w:E->R为边到实数权值的映射,对于每对顶点u,v∈V,找出从u到 ...

  5. 图的所有顶点间的最短路径(Floyd算法)

    问题描述 对每一对顶点vi ≠ vj,求出vi与vj之间的最短路径和最短路径长度 Floyd算法 Floyd(Floyd-Warshall)算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中 ...

  6. 弗洛伊德算法(求每一对顶点间的最短路径)

    每一对顶点间的最短路径 求解每一对顶点间的最短路径有两种方法:其一是分别以图中的每个顶点为源点共调用n次迪杰斯特拉算法:其二是采用下面介绍的弗洛伊德算法.这两种算法的时间复杂度均为O(n^3),但后者 ...

  7. 弗洛伊德算法Floyed(求各顶点间最短路径):可打印最短路径

    #include <iostream> #include <string> #include <iomanip> using namespace std; #def ...

  8. 有向图,无向图的邻接矩阵和邻接表模板

    图 图的定义 有向图 概念 模板 邻接矩阵 邻接表 无向图 概念 模板 邻接矩阵 邻接表 简单图 完全图 图的定义 图 GGG 由顶点集 VVV 和边集 EEE 组成,记为 G=(V,E)G=(V,E ...

  9. python两列数据生成邻接矩阵_用python实现邻接矩阵转换为邻接表,python语言实现...

    graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C','G','H'], 'E': ['F'], 'F': ['C']} # ...

最新文章

  1. webView 显示一段 html 代码
  2. mysql 数据类_MySQL数据类型
  3. 那个名为 XROS 的操作系统,倒在了元宇宙浪潮中!
  4. sklearn 特征降维利器 —— PCA TSNE
  5. Centos-显示文件类型-file
  6. 在线考试系统设计+源码
  7. 电子通信协议之CAN总线协议篇
  8. volatile详解
  9. 简仿Path的商店表情弹出模块
  10. win10录屏电流声_电脑录屏出现杂音?可能是这几种原因
  11. 把JRuby Rails应用部署在Java应用服务器上
  12. 八戒帮扶V5微信公众平台任务系统完美运营v1.5.8
  13. 【观察】加速IPFS基础设施落地,西部数据的三重独特优势
  14. ROS-talker,listener
  15. 工作中遇到的问题合集
  16. Android开发实战《手机安全卫士》——11.“进程管理”模块拓展 窗体小部件 生成快捷方式
  17. 12步解N-S方程之第二步
  18. SFTP获取文件夹内的文件名,文件大小,文件修改时间
  19. 常用自媒体工具网站大全,收集整理32个工具分享!
  20. Android获取网络图片的宽高

热门文章

  1. 华为 ACL访问控制列表 (高级ACL为例)
  2. Spring Cloud Feign启动Load balancer does not have available server for client分析
  3. 2679 Adventurous Driving 解题报告
  4. gdb反汇编disassemble
  5. Hbase分析报告(转载)
  6. AList软件的使用--已经直接在win上进行磁盘映射--修改数据源为mysql
  7. 【产业互联网周报】寒武纪IPO过会;中芯国际刷新科创板IPO速度,但恐不能为华为代工;国家网信办等8部门集中整治网络直播行业...
  8. EasyExcel导出数据超过Excel单表上限时进行分表
  9. UIImage图形放大或缩小
  10. 关于BBSXP 7.00 BETA2 SQL通杀教程