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;
}
原文地址:https://www.cnblogs.com/levarz/p/12925447.html