邻接矩阵 + 深度优先遍历

  1 /**
  2   知识点:(有向图)
  3     强连通图的邻接矩阵存储图;
  4     强连通图的深度优先遍历(递归方式实现)
  5 */
  6 #include <stdio.h>
  7 #include <string.h>
  8 #define N 5
  9 #define ARC 10
 10 int visit[ARC];
 11 typedef struct {
 12     char vex[ARC][N];///顶点
 13     int arc[ARC][ARC];
 14     int numv,nume;///顶点,边的个数
 15 }Graph;
 16 int getIndex(Graph& G,char s[]){
 17     for(int i = 0; i < G.numv; i++){
 18         if(strcmp(s,G.vex[i]) == 0)
 19             return i;
 20     }
 21     return -1;
 22 }
 23 void create(Graph& G){
 24     printf("请分别输入顶点和边的个数:\n");
 25     scanf("%d%d",&G.numv,&G.nume);
 26     printf("输入图的顶点信息:\n");
 27     for(int i = 0; i < G.numv; i++)
 28         scanf("%s",G.vex[i]);
 29     printf("请输入边的信息:\n");
 30     ///初始化数组G.arc
 31     for(int i = 0; i < G.nume; i++)
 32         for(int j = 0; j < G.nume; j++)
 33             G.arc[i][j] = 0;
 34     char s[N],e[N];
 35     int i = 0,u,v;
 36     while(i < G.nume){
 37         scanf("%s%s",s,e);
 38         u = getIndex(G,s);
 39         v = getIndex(G,e);
 40         ///假设输入的起始和终止顶点都存在
 41         G.arc[u][v] = 1;
 42         i++;
 43     }
 44 }
 45 ///输出矩阵
 46 void output(Graph G){
 47     printf("    ");
 48     for(int i = 0; i < G.numv; i++)
 49         printf("%4s",G.vex[i]);
 50     printf("\n");
 51     for(int i = 0; i < G.numv; i++){
 52         for(int j = -1; j < G.numv; j++){
 53             if(j == -1)
 54                 printf("%4s",G.vex[i]);
 55             else{
 56                 printf("%4d",G.arc[i][j]);
 57             }
 58         }
 59         printf("\n");
 60     }
 61 }
 62
 63 ///查找图G中位序为s的第一个邻接点
 64 int firstVex(Graph G,int s){
 65     for(int i = 0; i < G.numv; i++){
 66         if(G.arc[s][i] == 1)
 67             return i;
 68     }
 69     return -1;
 70 }
 71 ///返回顶点s的(相对于w的)下一个邻接顶点
 72 ///若w是s的最后一个邻接顶点,则返回空
 73 int nextVex(Graph G,int s,int w){
 74     for(int i = w+1; i < G.numv; i++){
 75         if(G.arc[s][i] == 1)
 76             return i;
 77     }
 78     return -1;
 79 }
 80 ///递归法 深度优先遍历
 81 void dfs(Graph G,int s){///从位置为s的顶点开始遍历
 82     for(int w=firstVex(G,s);w!=-1;w=nextVex(G,s,w)){
 83         if(!visit[w]){
 84             printf("%4s",G.vex[w]);
 85             visit[w] = 1;
 86             dfs(G,w);
 87         }
 88     }
 89 }
 90
 91 int main(void){
 92     Graph G;
 93     create(G);
 94     output(G);
 95     printf("请输入遍历的起始顶点:\n");
 96     char s[N];
 97     scanf("%s",s);
 98     for(int i = 0; i < G.numv; i++)
 99         visit[i] = 0;
100     printf("%4s",s); visit[getIndex(G,s)] = 1;
101     dfs(G,getIndex(G,s));
102     return 0;
103 }

测试数据:

8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v7 v6
v1

时间: 2024-11-15 21:05:47

邻接矩阵 + 深度优先遍历的相关文章

邻接矩阵的深度优先遍历

摘要:对<大话数据结构>P240——邻接矩阵的深度优先遍历,进行了自己的理解并完善了代码.Qt Creator测试通过. 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接矩阵的存储结构创建该图,再进行深度优先遍历.代码和解释如下: #include <iostream> #include <stdlib.h> using namespace std; typedef struct//图的邻接矩阵存储结构 { char vexs[5]; int arc[5][5];

邻接矩阵的深度优先遍历(java版)

这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.datastruct; import java.util.Scanner; public class MGraph { //定义图结构,使用邻接矩阵存储 private static class Graph{ final int MAXVEX = 10;//最大顶点数 final int INFINITY

C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历

#include<iostream> using namespace std; typedef char vertextype; typedef int edgetype; #define maxvex 100 #define infinity 1000 #include<queue> int visited[100]; class MGraph{ public: vertextype vexs[maxvex]; edgetype arc[maxvex][maxvex]; int

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表

PTA 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVe

练习6.1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; t

邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <limits.h> #include "aqueue.h" #define MAX_VALUE INT_MAX #define MAX_NUM 100 typedef char node_type; typedef struct matrix { node_type vertex[M

图的深度优先遍历&amp;广度优先遍历

1.什么是图的搜索? 指从一个指定顶点可以到达哪些顶点 2.图的两种存储结构 (1)邻接矩阵 原理就是用两个数组,一个一维数组保存顶点集,一个二维数组(邻接矩阵)保存边集. (2)邻接表 2.深度优先遍历

邻接表的深度优先遍历

转载请注明出处http://www.cnblogs.com/hslzju 对<大话数据结构>P241——邻接表的深度优先遍历,进行了自己的理解并完善了代码. 邻接矩阵的深度优先遍历见http://www.cnblogs.com/hslzju/p/5399249.html 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接表的存储结构创建该图,再进行深度优先遍历.代码和解释如下(Qt Creator测试通过): 1 #include <iostream> 2 #include &