无向图的路径判断

题目描述

现有一个由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<=n、m、t<=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更为快速,也比较好理解。

这道题不需要设置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 edge[1005],是一个不定数组,vis是一个存储使用状态的一个一维数组。

代码

#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;
}

小编蒟蒻一个,有什么问题请大佬不惜赐教Orz

posted @ 2022-04-19 21:07  骆美辰  阅读(100)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },