zoukankan      html  css  js  c++  java
  • Layer 1

    描述

    给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:

    background Layer 1 v1 v2 v3 v4 v6 v8 v7 v5

    输入

    输入的第1行有2个整数m和n。表示图g有m个顶点和n条边。
    第2行是m个以空格隔开的字符串,依次是图中第1个顶点的名字,第2个顶点的名字.....第m个顶点的名字。
    此后还有n行,每行由2个字符串构成,分别是构成图中1条边的两个顶点。我们约定不会有重边。

    输出

    输出有2行。
    第1行是从第1个顶点出发对图g做深度优先遍历得到的顶点序列。
    第2行是从第1个顶点出发对图g做广度优先遍历得到的顶点序列。

    样例输入

    8 9
    v1 v2 v3 v4 v5 v6 v7 v8
    v1 v2
    v1 v3
    v1 v6
    v2 v3
    v2 v4
    v3 v4
    v4 v6
    v5 v6
    v7 v8
    

    样例输出

    v1 v6 v5 v4 v3 v2 v7 v8
    v1 v6 v3 v2 v5 v4 v7 v8
    

    提示

    注意:从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。
    ps:注意提示内容,输出方式!!!!,然后正常做就ok

    完整代码

    #include <iostream>
    #include <stdlib.h>
    #include <cstring>
    #include <queue>
    #define VISITED 1
    #define UNVISITED 0
    #define MAX_SIZE 31767
    #define MAX_LEN 30
    
    using namespace std;
    
    int visited[MAX_SIZE] = {0};
    typedef struct ANode
    {
       int adjvex;
       struct ANode *nextarc;
    }AreNode;
    typedef struct Vnode
    {
        char info[MAX_LEN];
        AreNode *firstarc;
    }VNode;
    typedef struct 
    {
        VNode adjlist[MAX_SIZE];
        int n, e;
    }AdjGraph;
    void init_visited_mess(AdjGraph *g)
    {
        memset(visited,g->n,UNVISITED);
    }
    void CreatGraph(AdjGraph *&g, int n, int e)
    {
        char vex[MAX_LEN], nextarc[MAX_LEN];
        int i, j;
        g = (AdjGraph*) malloc (sizeof(AdjGraph));
        g->n = n;
        g->e = e;
        for (i = 1; i <= n; i++) {
          scanf("%s ",g->adjlist[i].info);
          g->adjlist[i].firstarc = NULL;
        }
        while (e--) {
            AreNode *nex;
            scanf("%s %s",vex,nextarc);
            for (i = 1; i <= n; i++)
                if (strcmp(g->adjlist[i].info,vex)==0) break;
            for (j = 1; j <= n; j++)
                if (strcmp(g->adjlist[j].info,nextarc)==0) break;
            nex = (AreNode*) malloc (sizeof(AreNode));
            nex->adjvex = j;
            nex->nextarc = g->adjlist[i].firstarc;
            g->adjlist[i].firstarc = nex;
            nex = (AreNode*) malloc (sizeof(AreNode));
            nex->adjvex = i;
            nex->nextarc = g->adjlist[j].firstarc;
            g->adjlist[j].firstarc = nex;
        } 
    }
    void DisplayGraph(AdjGraph *g)
    {
        int i;
        AreNode *p;
        for (i = 1; i <= g->n; i++) {
            p = g->adjlist[i].firstarc;
            printf("%3s: ",g->adjlist[i].info);
            while (NULL != p) {
                printf("%3s ",g->adjlist[p->adjvex].info);
                p = p->nextarc;
            }
            printf("
    ");
        }
    }
    AreNode* find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
    {
        AreNode *p;
        p = g->adjlist[adjvex].firstarc;
        int max_adjvex = 0;
        while (NULL != p) {
            if (visited[p->adjvex] == UNVISITED)
                max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
            p = p->nextarc;
        }
        p = g->adjlist[adjvex].firstarc;
        while (NULL != p) {
           if (p->adjvex == max_adjvex) break;
           p = p->nextarc;
        }
        if (max_adjvex == adjvex) p = NULL;
        return p;
    }
    // int find_nextarc_max_adjvex(AdjGraph *g, int adjvex)
    // {
    //     AreNode *p;
    //     p = g->adjlist[adjvex].firstarc;
    //     int max_adjvex = 0;
    //     while (NULL != p) {
    //         if (visited[p->adjvex] == UNVISITED)
    //             max_adjvex = max_adjvex > p->adjvex ? max_adjvex : p->adjvex;
    //         p = p->nextarc;
    //     }
    //     return max_adjvex;
    // }
    void DFS_connected_graph(AdjGraph *g, int adjvex)
    {
        int nex_adj;
        AreNode *p;
        printf("%s ",g->adjlist[adjvex].info);
        visited[adjvex] = VISITED;
        p = find_nextarc_max_adjvex(g,adjvex);
        while (NULL != p) {
            if (visited[p->adjvex] == UNVISITED) DFS_connected_graph(g,p->adjvex);
            p = p->nextarc;
        }
    }
    void DFS(AdjGraph *g) 
    {
        int i;
        for (i = 1; i <= g->n; i++)
            if (visited[i] == UNVISITED) DFS_connected_graph(g,i);
        memset(visited,UNVISITED,MAX_SIZE);
    }
    void BFS_connected_graph(AdjGraph *g, int adjvex)
    {
        int top_adjvex, i;
        AreNode *p;
        queue <int> nextarcs;
        printf("%s ",g->adjlist[adjvex].info);
        visited[adjvex] = VISITED;
        nextarcs.push(adjvex);
        while (!nextarcs.empty()) {
            top_adjvex = nextarcs.front();
            nextarcs.pop();
            p = find_nextarc_max_adjvex(g,top_adjvex);
            while (NULL != p) {
               if (visited[p->adjvex] == UNVISITED) {
                   printf("%s ",g->adjlist[p->adjvex].info);
                   visited[p->adjvex] = VISITED;
                   nextarcs.push(p->adjvex);
               }
               p = find_nextarc_max_adjvex(g,top_adjvex);
            }
        } 
    }
    void BFS(AdjGraph *g)
    {
        int i;
        for (i = 1; i <= g->n; i++) 
            if (visited[i] == UNVISITED) BFS_connected_graph(g,i);
         memset(visited,UNVISITED,MAX_SIZE);
    }
    int main(int argc, char const *argv[])
    {
        AdjGraph *g;
        int n,m;
        cin >> n >> m;
        CreatGraph(g,n,m);
        // DisplayGraph(g);
        DFS(g); cout << endl;
        BFS(g);
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    【C++17】std::optional

    【GDB 】GDB基本命令
    【二叉树系列 | 01】二叉树遍历
    【coredump | 01】coredump的阐述
    【C++ Template | 06】std::enable_if和SFINAE
    std::dclval 使用教程
    系统设计实践(03)- Instagram社交服务
    系统设计实践(02)- 文本存储服务
    系统设计实践(01)
  • 原文地址:https://www.cnblogs.com/levarz/p/12925447.html
Copyright © 2011-2022 走看看