• 简单深度优先搜索


    #include <iostream>
    
    using namespace std;
    #define MAX_SIZE 20
    
    using namespace std;
    
    static int x = [](){std::ios::sync_with_stdio(false);cin.tie(0);return 0;}();
    typedef struct A{
        int adj;
        int *ptr;
    }Val[MAX_SIZE][MAX_SIZE];
    
    struct Graph{
        int Vertex[MAX_SIZE];
        Val val;
        int vertex, arc;
    };
    
    int FindVertex(Graph *G, int v){//根据顶点数组判断顶点在二维数组中的位置
        for(int i = 0; i < G->vertex; ++i){
            if(G->Vertex[i] == v){
                return i;
            }
        }
        return -1;
    }
    
    void CreatGraph(Graph *G){//创建无向图
        cout << "Please input the number of vertex and arc:" << endl;
        cin >> G->vertex >> G->arc;
        cout << "Please input the data of vertex:" << endl;
        for(int i = 0; i < G->vertex; ++i)
            cin >> G->Vertex[i];
        for(int i = 0; i < G->vertex; ++i){
            for(int j = 0; j < G->arc; ++j){
                G->val[i][j].adj = 0;
                G->val[i][j].ptr = nullptr; 
            }
        } 
        cout << "Please input the relation of vertex and arc:" << endl;
        for(int i = 0; i < G->arc; ++i){
            int v, a;
            cin >> v >> a;
            int m = FindVertex(G, v);
            int n = FindVertex(G, a);
            if(m == -1 || n == -1){
                cout << "No!!!";
                break;
            }
            G->val[m][n].adj = 1;
            G->val[n][m].adj = 1;
        }
    }
    
    int Visited[MAX_SIZE];//记录顶点是否被访问过
    
    int FindFirst(Graph *G, int v){//寻找顶点周围有边的顶点
        for(int i = 0; i < G->vertex; ++i){
            if(G->val[v][i].adj)
                return i;
        }
        return -1;
    }
    
    int NextVertex(Graph *G, int v, int w){//从下一个位置寻找,顶点周围有边的顶点
        for(int i = w + 1; i < G->vertex; ++i ){
            if(G->val[v][i].adj)
                return i;
        }
        return -1;
    }
    
    void PrintV(Graph *G, int v){
        cout << G->Vertex[v] << " ";
    }
    
    void DFS(Graph *G, int v){
        Visited[v] = true;//准备访问该顶点
        PrintV(G, v);//访问顶点
        for(int i = FindFirst(G, v); i >= 0; i = NextVertex(G, v, i)){
            if(!Visited[i]){//如果该顶点未被访问,则继续搜索
                DFS(G, i);
            }
        }
    }
    
    void DFSTr(Graph *G){
        for(int i = 0; i < G->vertex; ++i){
            Visited[i] = false;//设置全部顶点未访问
        }
        for(int i = 0; i < G->vertex; ++i){
            if(!Visited[i]){
                DFS(G, i);
            }
        }
    }
    
    int main()
    {
        Graph *G = new Graph[sizeof(Graph)];
        CreatGraph(G);
        DFSTr(G);
        
        return 0;
    }
  • 相关阅读:
    Word 2003 Excel 2003 的迟绑定(late binding) 方法 时空地图TimeGIS
    快手之友情链接 时空地图TimeGIS
    InfoVista.NET 概述 时空地图TimeGIS
    快手博客 时空地图TimeGIS
    快手文档 www.kuaishou.net 时空地图TimeGIS
    快手之Excel篇 www.kuaishou.net 时空地图TimeGIS
    InfoVista.NET Beta 时空地图TimeGIS
    中国互联网络发展状况统计报告2009年 时空地图TimeGIS
    http://wiki.kuaishou.net 时空地图TimeGIS
    快手影音 www.timegis.com 时空地图TimeGIS
  • 原文地址:https://www.cnblogs.com/Mayfly-nymph/p/10584465.html
Copyright © 2020-2023  润新知