无向图_深度优先遍历

[练习]输入边构成无向图,求以顶点0为起点的深度优先遍历序列。

第一行为两个整数n、e,表示图顶点数和边数。以下e行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。1≤n≤20,0≤e≤190,有多组测试数据)

Output
前面n行输出无向图的邻接矩阵,最后一行输出以顶点0为起点的深度优先遍历序列,对于任一起点,首先遍历的是终点序号最小的、尚未被访问的一条边。每个序号后输出一个空格。每组结果换行

Sample Input
4 5
0 1
0 3
1 2
1 3
2 3

Sample Output
0 1 0 1
1 0 1 1
0 1 0 1
1 1 1 0
0 1 2 3

 

C:

#include<stdio.h>

#define MAX_VERTEX_NUM 20

bool visited[MAX_VERTEX_NUM];

int count;

typedef struct ArcCell

{

         intadj;

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

 

typedef struct

{

         intvexs[MAX_VERTEX_NUM];

         AdjMatrixarcs;

         intvexnum,arcnum;

}MGraph;

 

void CreateMG(MGraph &G)

{

         inti,j,k,v1,v2;

         scanf(“%d%d”,&G.vexnum,&G.arcnum);

         for(i=0;i<G.vexnum;i++)

         G.vexs[i]=i;

         for(i=0;i<G.vexnum;i++)

         {

                   for(j=0;j<G.vexnum;j++)

                   G.arcs[i][j].adj=0;

         }

         //初始化结束

         for(k=0;k<G.arcnum;k++)

         {

                   scanf(“%d%d”,&v1,&v2);

                   G.arcs[v1][v2].adj=1;

                   G.arcs[v2][v1].adj=G.arcs[v1][v2].adj;

         }

         for(i=0;i<G.vexnum;i++)

         {

                   for(j=0;j<G.vexnum-1;j++)

                   printf(“%d”,G.arcs[i][j].adj);

                   printf(“%d\n”,G.arcs[i][G.vexnum-1].adj);

         }

}

 

int FirstAdjVex(MGraph G,int v)

{

         intj;

         for(j=0;j<G.vexnum;j++)

         {

                   if(G.arcs[v][j].adj==1)

                   returnj;

         }

         return-1;

}

 

int NextAdjVex(MGraph G,int v,int w)

{

         intj;

         for(j=w+1;j<G.vexnum;j++)

         {

                   if(G.arcs[v][j].adj==1)

                   returnj;

         }

         return-1;

}

 

void DFS(MGraph G,int v)

{

         intw;

         visited[v]=true;

         count++;

         if(count<G.vexnum)

         printf(“%d”,v);

         elseprintf(“%d\n”,v);

         for(w=FirstAdjVex(G,v);w!=-1;w=NextAdjVex(G,v,w))

         {

                   if(!visited[w])

                   DFS(G,w);

         }

}

 

void DFSTraverse(MGraph G)

{

         intv;

         for(v=0;v<G.vexnum;v++)

         visited[v]=false;

         for(v=0;v<G.vexnum;v++)

         {

                   if(!visited[v])

                   DFS(G,v);

         }

}

 

int main()

{

         while(1)

         {

                   count=0;

                   MGraphG;

             CreateMG(G);

             DFSTraverse(G);

         }

         return0;

}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/dingmengru/article/details/40713097
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞