一个问题
查看原帖
一个问题
580608
lupengheyyds楼主2024/9/2 21:28

为什么 DFS 的正确性有误,只能用 BFS?

以下是我的 DFS 暴力,WA了 77 个点

#include <bits/stdc++.h>
#define loop(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef pair<int, int> pa;
const int NN = 5005;
int n, m, Q;
bool able[NN][NN], c[NN], mark[NN][NN], vst[NN][NN];
vector<int> ed[NN][2];
bool DFS(int x, int y) {
    if (mark[x][y]) return able[x][y];
    mark[x][y] = true;
    if (c[x] != c[y]) return able[x][y] = false;
    loop(col, 0, 1) {
        for (int nx : ed[x][col])
            for (int ny : ed[y][col]) {
                able[x][y] |= DFS(nx, ny);
                if (able[x][y]) return true;
            }
    }
    return false;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> Q;
    for (int i = 1; i <= n; i++) {
        char ch;
        cin >> ch;
        c[i] = ch - '0';
    }
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        ed[u][c[v]].push_back(v);
        ed[v][c[u]].push_back(u);
    }
    for (int i = 1; i <= n; i++)
        mark[i][i] = able[i][i] = true;
    for (int x = 1; x <= n; x++)
        for (int y : ed[x][c[x]])
            mark[y][x] = able[y][x] = mark[x][y] = able[x][y] = true;
    while (Q--) {
        int x, y;
        cin >> x >> y;
        DFS(x, y) ? cout << "YES\n" : cout << "NO\n";
    }
    return 0;
}
2024/9/2 21:28
加载中...