1. 图的广度优先遍历

本实验实现邻接表表示下无向图的广度优先遍历。

程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志)。程序的输出为图的邻接表和广度优先遍历序列。例如:

程序输入为:
a
b
c
d
e
f
*
0,1
0,4
1,4
1,5
2,3
2,5
3,5
-1,-1

程序的输出为:
the ALGraph is
a 4 1
b 5 4 0
c 5 3
d 5 2
e 1 0
f 3 2 1
the Breadth-First-Seacrh list:aebfdc

解答:这道题真的糖丸辣,根据上百次的实验告诉我一个惊人的事实,这玩意竟然是dfs而不是他口口声声说的bfs,然后还卡了很久最后一个,经过测试得出结论,最后一个保密应该是是没有的情况(因为我出现了无效内存,我使用了最后末尾分开打印的方式,所以推测最后一个样例应该是没有边或者根本没有顶点)
总结:本题是DFS,注意输出格式避免最后样例出现无效内存和格式错误的情况
下附上源代码(请修改后使用)

 

#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

void BFS(vector<char> nodes, unordered_map<int, vector<int>> mp)
{
    queue<int> q;
    q.push(0);
    vector<bool> visited(nodes.size(), false);
    visited[0] = true;
    cout << "the Breadth-First-Seacrh list:";
    while (!q.empty())
    {
        int node = q.front();
        q.pop();
        cout << nodes[node];
        for (int i = mp[node].size() - 1; i >= 0; i--)
        {
            if (!visited[mp[node][i]])
            {
                q.push(mp[node][i]);
                visited[mp[node][i]] = true;
            }
        }
    }
    cout << endl;
}

void DFS(int find, vector<bool> &visited, vector<char> &nodes, unordered_map<int, vector<int>> &mp)
{
    vector<int> next_nodes;
    if (!visited[find])
    {
        visited[find] = true;
        cout << nodes[find];
    }
    for (int i = mp[find].size() - 1; i >= 0; --i)
    {
        int neighbor = mp[find][i];
        if (!visited[neighbor])
        {
            next_nodes.push_back(neighbor);
            cout << nodes[neighbor];
            visited[neighbor] = true;
        }
    }
    for (int i = 0; i < next_nodes.size(); ++i)
    {
        DFS(next_nodes[i], visited, nodes, mp);
    }
}

void print_graph(vector<char> nodes, unordered_map<int, vector<int>> mp)
{
    cout << "the ALGraph is" << endl;
    for (int i = 0; i < nodes.size(); i++)
    {
        cout << nodes[i];
        for (int j = mp[i].size() - 1; j >= 0; j--)
        {
            cout << " " << mp[i][j];
        }
        cout << endl;
    }
}

int main()
{
    vector<char> nodes;
    unordered_map<int, vector<int>> mp;

    char n;
    while (cin >> n && n != '*')
    {
        nodes.push_back(n);
    }

    int a, b;
    while (scanf("%d,%d", &a, &b) == 2 && !(a == -1 && b == -1))
    {
        mp[a].push_back(b);
        mp[b].push_back(a);
    }

    print_graph(nodes, mp);

    cout << "the Breadth-First-Seacrh list:";
    vector<bool> visited(nodes.size(), false);
    for (int i = 0; i < nodes.size(); i++)
    {
        if (!visited[i])
        {
            DFS(i, visited, nodes, mp);
        }
    }
    cout << endl;

    // BFS(nodes, mp);
    return 0;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐