bfs和dfs

#include<iostream>

#include<queue>

#include<stack>

#include<stdio.h>

#include<stdlib.h>

#define MAX 100

using namespace std;

typedef struct

{

   int edges[MAX][MAX];    //邻接矩阵

   int n;                  //顶点数

   int e;                  //边数

}MGraph;

bool visited[MAX];          //标记顶点是否被访问过

void creatMGraph(MGraph &G)    //用引用作参数

{

   int i,j;

   int s,t;                 //存储顶点编号

   int v;                   //存储边的权值

   for(i=0;i<G.n;i++)       //初始化

    {

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

       {

           G.edges[i][j]=0;

       }

       visited[i]=false;

    }

   for(i=0;i<G.e;i++)      //对矩阵相邻的边赋权值

    {

       scanf("%d %d %d",&s,&t,&v);   //输入边的顶点编号以及权值

       G.edges[s][t]=v;

    }

}

void DFS(MGraph G,int v)      //深度优先搜索

{

   int i;

   printf("%d ",v);         //访问结点v

   visited[v]=true;

   for(i=0;i<G.n;i++)       //访问与v相邻的未被访问过的结点

    {

       if(G.edges[v][i]!=0&&visited[i]==false)

       {

           DFS(G,i);

       }

    }

}

void DFS1(MGraph G,int v)   //非递归实现

{

   for(int i=0;i<G.n;i++)       //初始化

    {

       visited[i]=false;

    }

   stack<int> s;

   printf("%d ",v);       //访问初始结点

   visited[v]=true;

   s.push(v);              //入栈

   while(!s.empty())

    {

       int i,j;

       i=s.top();          //取栈顶顶点

       for(j=0;j<G.n;j++)  //访问与顶点i相邻的顶点

       {

           if(G.edges[i][j]!=0&&visited[j]==false)

           {

                printf("%d ",j);     //访问

                visited[j]=true;

                s.push(j);           //访问完后入栈

                break;               //找到一个相邻未访问的顶点,访问之后则跳出循环

           }

       }

       if(j==G.n)                   //如果与i相邻的顶点都被访问过,则将顶点i出栈

           s.pop();

    }

}

void BFS(MGraph G,int v)      //广度优先搜索

{

   for(int i=0;i<G.n;i++)       //初始化

    {

       visited[i]=false;

    }

   queue<int> Q;            //STL模板中的queue

   printf("%d ",v);

   visited[v]=true;

   Q.push(v);

   while(!Q.empty())

    {


       int i,j;

       i=Q.front();         //取队首顶点

       Q.pop();

       for(j=0;j<G.n;j++)   //广度遍历

       {

           if(G.edges[i][j]!=0&&visited[j]==false)

           {

//              printf("\n 断点1 ");

                printf("%d ",j);

                visited[j]=true;

                Q.push(j);

           }

       }

    }

}

int main(void)

{

   int n,e;    //建立的图的顶点数和边数

   while(scanf("%d %d",&n,&e)==2&&n>0)

    {

       MGraph G;

       G.n=n;

       G.e=e;

       creatMGraph(G);

       printf("深度递归算法: ");

       DFS(G,0);

       printf("\n");

       printf("深度非递归算法: ");

       DFS1(G,0);

       printf("\n");

       printf("广度遍历算法: ");

       BFS(G,0);

       printf("\n");

    }

   return 0;

}

/*  89

    01 1

    02 1

    13 1

    14 1

    25 1

    26 1

    56 1

    37 1

    47 1     */

// 8 9 0 1 1 0 2 1 1 3 1  1 4 1 2 5 1 2 6 1 5 6 1 3 7 1 4 7 1


猜你喜欢

转载自blog.csdn.net/lianghudream/article/details/78841230