邻接矩阵无向图 有无环 C实现 (dfs)
来源:互联网 发布:金融行业seo 编辑:程序博客网 时间:2024/05/23 20:51
核心思想:
根据图与树的关系 到 图与连通分量关系 知
无环时候: 顶点数 -边数 = 树个数 (连通分量数)
有环时候:顶点数-边数 < 树个数(连通分量数)
连通分量数可以在dfs中求得
void dfs_trvsal(Graph g){int i;for (i = 0; i < g.vex_num; i++) {visited[i] = FALSE;}link_component = 0;for (i = 0; i < g.vex_num; i++) {if (!visited[i]) {link_component++; //图连通的话 该for循环只进行一次 就可以遍历整个图了 连通分量也就是1dfs(g, i);}}}
完整代码实现:
#include<stdio.h>#include<stdlib.h>#include<ctype.h>#define MAXVEX 100#define INFINITY 65535#define TRUE 1#define FALSE 0#define Bool int Bool visited[MAXVEX];int link_component; //连通分量的数量 typedef int EdgeType;typedef char VertexType;typedef struct Graph {VertexType vex[MAXVEX];EdgeType edge[MAXVEX][MAXVEX];int vex_num, edge_num;}Graph;void init_graph(Graph *g){int i, j;for (i = 0; i < g->vex_num; i++) {for (j = 0; j < g->vex_num; j++) {if (i == j) {g->edge[i][j] = 0;}elseg->edge[i][j] = INFINITY;}}}char read_char(){char ch;do {ch = getchar();} while (!isalpha(ch));return ch;}int get_pos(Graph g, char ch){int i;for (i = 0; i < g.vex_num; i++) {if (g.vex[i] == ch)return i;}return -1;}void create_graph(Graph *g){int i, w, k;//printf("请输入顶点数与边数:\n");scanf("%d%d", &g->vex_num, &g->edge_num);init_graph(g);// 初始化//printf("请输入顶点信息:\n");for (i = 0; i < g->vex_num; i++) {g->vex[i] = read_char();}//printf("请输入边的信息:\n");char c1, c2;int p1, p2;for (k = 0; k < g->edge_num; k++) {c1 = read_char();c2 = read_char();scanf("%d", &w);p1 = get_pos(*g, c1);p2 = get_pos(*g, c2);g->edge[p1][p2] = w;g->edge[p2][p1] = g->edge[p1][p2];}}void print_graph(Graph g){int i, j;for (i = 0; i < g.vex_num; i++) {for (j = 0; j < g.vex_num; j++) {if (g.edge[i][j] == INFINITY)printf("%5c", '*');else {printf("%5d", g.edge[i][j]);}}printf("\n");}}void dfs(Graph g, int i){int j;visited[i] = TRUE;printf("%c ", g.vex[i]);for (j = 0; j < g.vex_num; j++) {if (!visited[j] && g.edge[i][j] != INFINITY && i != j) {dfs(g, j);visited[j] = TRUE;}}}void dfs_trvsal(Graph g){int i;for (i = 0; i < g.vex_num; i++) {visited[i] = FALSE;}link_component = 0;for (i = 0; i < g.vex_num; i++) {if (!visited[i]) {link_component++;dfs(g, i);}}}int main(){int i;Graph g;create_graph(&g);//print_graph(g);dfs_trvsal(g);printf("\n");if ((link_component + g.edge_num) > g.vex_num) { // 核心printf("有环.");}else {printf("无环.\n");}if (link_component == 1) {printf("图连通.");}else {printf("图不连通.");}getchar();getchar();return 0;}
阅读全文
1 0
- 邻接矩阵无向图 有无环 C实现 (dfs)
- dfs, bfs之邻接矩阵无向图
- 邻接矩阵遍历(无向图,邻接矩阵,DFS,BFS)
- 邻接矩阵 有向图 判断是否有环 是否连通 DFS C实现~
- 图的实现 邻接矩阵+无向图
- 邻接矩阵实现无向图的创建
- 邻接矩阵实现的无向图
- 无向图邻接矩阵
- 邻接矩阵无向图
- 邻接矩阵--无向图
- 无向图的邻接矩阵 -- DFS - 深度优先遍历
- 深度优先生成树(无向图,邻接矩阵,DFS)
- 邻接矩阵无向图的创建和遍历(dfs)
- 邻接矩阵(有向图,无向图实现的差异)
- C++邻接矩阵实现有向图、无向图
- 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS
- 利用邻接矩阵存储无向图,并实现BFS(非递归) DFS(递归+非递归)两种遍历
- 邻接矩阵(无向图)
- 【面试题】MySQL相关
- LeetCode Graph:M310. Minimum Height Trees
- HDU6060-RXD and dividing 简单树形DP+贪心
- 看自己看过的书
- Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例
- 邻接矩阵无向图 有无环 C实现 (dfs)
- OpenCV(五) Opencv中 core 核心模块详解—— 常见的数据结构
- Http协议简介
- 初识nodejs5
- 通过Hibernate code generation configration反向生成实体类出现的问题
- J2EE网址链接有中文时乱码解决方案
- Linux上的free命令详解
- UVA 11059 Maximum Product
- linux下进程、以及进程间的通信机制