天天看点

dfs算法

#include<iostream>

#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();

    }

}

int main()

{

    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");

    }

    return 0;

}

// 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

继续阅读