C++-无向路的路径判断 解题思路

【Horn Studio】编程专栏: 电梯  解题思路

题目

1275: 无向图的路径判断

题目描述

现有一个由1,2,3,4...,n个点,m条边组成的无向图。请判断给定的t组数据x, y(x表示起点,y表示终点),针对每组数据是否存在一条通路,如果存在则输出Yes,否则输出No

输入

第1行:n m t (n、m、t使用空格隔开,其中n表示结点的数量,结点由1开始编号;m表示边的数量;t表示待判断的起点、终点有多少对。2<=nmt<=10002<=n、m、t<=1000)
接下来的m行,每行一对整数a b,a、b使用空格隔开,表示结点a与结点b之间存在一条边
接下来的t行,每行一对整数x y, x、y使用空格隔开,如果结点x与结点y之间存在一条通路则输出Yes,否则输出No;每行一个。

输出

如果指定的起点与终点之间存在一条通路则输出Yes,否则输出No,每行一个

样例输入 复制

5 3 4
1 2
3 4
1 4
2 3
2 4
3 5
2 5

样例输出 复制

Yes
Yes
No
No

提示

来源

思路

这道题BFS和DFS都可以解答,DFS更为简单,但可能TLE,BFS更为快速,也比较好理解。

BFS志同道合者:

这道题不需要设置sx,sy方位值,只需要一个队列即可做到,

for (int i = 0; i < edge[u].size(); i++) {
            int to = edge[u][i];
            if (vis[to] == 0) {
                vis[to] = 1;
                que.push(to);
            }
        }

这是一段核心代码,注意:edge在上方定义为vector <int> edge[1005],是一个不定数组,vis是一个存储使用状态的一个一维数组。

很简单(潘老师曰),不必惊慌……

DFS志同道合者

我觉得没人比我悲惨吧,找了两年的bug以为AC了,结果……

趁此机会,我也彻底地记住了这串让人欲Bug不能

复保持跟出卡P@@?@@h!%*%&&@……&%&@(@**#%……¥&@&)@()@+——P

的代码。

他比BFS而言,更像暴力,更简单,同样耗时也会多出来一点,但无妨,便把之。

注意!在DFS的for时,注意要像这么写,别问我是怎么知道的……

 

for (int i = 0; i < edge[u].size(); i++) {
        if (vis[edge[u][i]] == 1//记住!edge[u][i]才是Vis中要写的值,并非i)
            continue;
        if (dfs(edge[u][i], ed))
            return true;
    }

 

差不多到这里就可以结束了,接下来我将显示出代码:

代码(BFS)

#include <bits/stdc++.h>
using namespace std;
vector<int> edge[1005];
int n, m, t;
queue<int> que;
int vis[1005], mp[1005][1005];

void bfs(int st)
{
    memset(vis, 0, sizeof(vis));
    que.push(st);
    vis[st] = 1;
    while (que.size()) {
        int u = que.front();
        que.pop();
        mp[st][u] = mp[u][st] = 1;
        for (int i = 0; i < edge[u].size(); i++) {
            int to = edge[u][i];
            if (vis[to] == 0) {
                vis[to] = 1;
                que.push(to);
            }
        }
    }
    return;
}

int main()
{
    cin >> n >> m >> t;
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    for (int i = 1; i <= n; i++) {
        bfs(i);
    }
    for (int i = 1; i <= t; i++) {
        int u, v;
        cin >> u >> v;
        if (mp[u][v] == 1)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

 

彩蛋

:啊?你怎么还不会!这么简单,只需要澶嶄繚鎸佽窡鍑哄崱P@@?@@h锛�%*%&&@鈥︹��&%&@锛園**#%鈥︹�︼骏&@&锛堾锛堬級@+鈥斺�擯
鐨勪唬鐮併��
浠栨瘮BFS鑰岃█锛屾洿鍍忔毚鍔涳紝鏇寸畝鍗曪紝鍚屾牱鑰楁椂涔熶細澶氬嚭鏉ヤ竴鐐癸紝浣嗘棤濡紝渚挎妸涔嬨��
娉ㄦ剰锛佸湪DFS鐨刦or鏃讹紝娉ㄦ剰瑕佸儚杩欎箞鍐欙紝鍒棶鎴戞槸鎬庝箞鐭ラ亾鐨勨�︹��

 

 

就可以了!

 

posted @ 2022-04-16 21:56  冯子坤  阅读(82)  评论(0编辑  收藏  举报