码迷,mamicode.com
首页 > 其他好文 > 详细

邻接矩阵 + 深度优先遍历

时间:2016-07-22 18:49:06      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

  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

邻接矩阵 + 深度优先遍历

标签:

原文地址:http://www.cnblogs.com/yfs123456/p/5696011.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!