vector邻接表建图+DFS+BFS

以边操作为主的图用边集数组存储比较好,相比链式前向星,vector建图更容易懂。

#include 
#include 
#include 
#include 
#include 
using namespace std;
using LL = long long;
const int inf = 0x3f3f3f3f;
const int MAX_E = 1e5+5; // 最大边数
const int MAX_V = 1e4+5; // 最大节点数
int V, E; // 点、边
struct edge{ int to, w; };
vector G[MAX_E];
bool vis[MAX_V];

void input();
void Build(int x, int y, int w);
void _dfs(int s);
void dfs(int s); // 封装了memset
void bfs(int s);

int main()
{
    input();
    dfs(0);
    cout << endl;
    bfs(0);
    return 0;
}

void Build(int x, int y, int w = 1)
{
    edge e; e.to = y; e.w = w;
    G[x].push_back(e);
}

void input()
{
    int a,b,w;
    edge e;
    cin >> V >> E;
    for (int i = 0; i < E; i++)
    {
        cin >> a >> b >> w; // 带权
        //cin >> a >> b; // 不带权
        Build(a, b);
        Build(b, a); // 无向
    }
}

void _dfs(int s)
{
    vis[s] = true;
    cout << s << endl;
    for (int i = 0; i < G[s].size(); i++)
    {
        if (!vis[G[s][i].to]) _dfs(G[s][i].to);
    }
}

void dfs(int s)
{
    memset(vis, false, sizeof(vis)); // 这步不能递归,所以封装起来了
    _dfs(s);
}

void bfs(int s)
{
    memset(vis, false, sizeof(vis)); // 此处vis的含义是节点是否在队列中
    queue Q;
    Q.push(s);
    while (!Q.empty())
    {
        s = Q.front();
        Q.pop();
        cout << s << endl; // 出队,执行操作
        vis[s] = true;
        for (int i = 0; i < G[s].size(); i++) 
        {
            if (!vis[G[s][i].to]) 
            {
                Q.push(G[s][i].to);
                vis[G[s][i].to] = true;
            }
        }
    }
}


样例输入
从严老师书上借了张图,当无向图用了
vector邻接表建图+DFS+BFS_第1张图片

5 8
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60

输出

0
2
1
3
5
4

0
2
4
5
1
3

你可能感兴趣的:(算法模板)