zoukankan      html  css  js  c++  java
  • 图的深度优先遍历的实现 c/c++ DFS

    #include <iostream>

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    using namespace std;

     

    #define MAX 100

    #define LENGTH(a) (sizeof(a) / sizeof(a[0]))

     

    int visited[MAX];

     

    typedef struct _graph{

        char vexs[MAX];

        int vexnum;

        int edgnum;

        int matrix[MAX][MAX];

    }Graph,*PGgraph;

     

    static int get_position(Graph g, char ch){

        for(int i = 0;i<g.vexnum;i++){

            if(ch == g.vexs[i])

                return i;

        }

        return -1;

    }

     

    static char read_char(){

        char ch;

        while(!((((ch)>='a') && ((ch)<='z')) || (((ch)>='A') && ((ch)<='Z'))))

            ch = getchar();

        return ch;

    }

     

    Graph creat_graph(){

        char c1,c2;

        int v,e;

        int p1,p2;

        Graph pG;

        

        cout<<"input number of vex > ";

        cin>>v;

        

        cout<<"input number of edge > ";

        cin>>e;

        

        //memset(pG,0,sizeof(Graph));

        pG.vexnum = v;

        pG.edgnum = e;

        

        //Initialize vexs

        for(int i=0; i<pG.vexnum;i++){

            //pG.vexs[i] = read_char();

            cin>>pG.vexs[i] ;

        }

        

        //Initialize edges

        for(int i = 0;i < pG.edgnum; i++){

            //c1 = read_char();

            //c2 = read_char();

            cin>>c1>>c2;

            cout<<c1<<c2<<endl;

            p1 = get_position(pG, c1);

            p2 = get_position(pG, c2);

            pG.matrix[p1][p2] = 1;

            pG.matrix[p2][p1] = 1;

        }

        return pG;

    }

     

    static int next_vertex(Graph g, int v,int w){

        

        if(v<0 || v>g.vexnum-1|| w<0 || w>(g.vexnum-1))   return -1;

        

        for(int i=w+1; i < g.vexnum; i++){

            if(g.matrix[v][i] == 1return i;

        }

        

        return -1;

    }

     

     

    static int first_vertex(Graph g, int v){

        

        if(v<0 || v>g.vexnum-1)   return -1;

        

        for(int i=0; i < g.vexnum; i++){

            if(g.matrix[v][i] == 1return i;

        }

        

        return -1;

    }

     

    void DFS(Graph g, int i){

        

        if(visited[i] == 0){

            visited[i] = 1;

            cout<<g.vexs[i]<<" ";

        }

        int w = first_vertex(g,i);

        for(;w>=0; w = next_vertex(g,i,w)){

            if(!visited[w]) DFS(g,w);

            

        }

    }

     

     

     

    int main(int argc, const char * argv[]) {

        for(int i = 0; i < MAX; i++){

            visited[i] = 0;

        }

        Graph g;

        g= creat_graph();

        

        for(int i = 0; i< g.vexnum; i++){

            if(!visited[i])         DFS(g,i);

        }

        return 0;

    }

  • 相关阅读:
    Spring Boot的每个模块包详解
    spring框架所有包说明
    TCP三次握手和四次挥手
    线程池实现原理
    AVL树与红黑树
    去哪儿网面经
    什么是缓存一致性问题?如何解决?
    Redis的应用场景和优缺点
    线程池
    手写快排
  • 原文地址:https://www.cnblogs.com/sweetiemelody/p/4296427.html
Copyright © 2011-2022 走看看