1. 程式人生 > 其它 >洛谷P2419 [USACO08JAN]Cow Contest S 題解 DAG上的簡單搜尋

洛谷P2419 [USACO08JAN]Cow Contest S 題解 DAG上的簡單搜尋

題目連結:https://www.luogu.com.cn/problem/P2419

解題思路:

本題其實是求解一類 “關鍵點”(這裡指的關鍵點是所有點和它之間都能夠達到的那些點),我是用dfs搜了 \(n\) 邊,因為是 DAG ,所以時間複雜度為 \(O(n^2)\)

但是雖然題面裡說保證是 DAG,但是資料好像沒有完全保證的樣子。所以在 dfs 函式的開頭加了一句記憶化操作。

示例程式:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
vector<int> g[maxn];
int n, m, cnt;
bool ok[maxn][maxn];

// 判斷是否存在一條從x到u的路徑
void dfs(int x, int u) {
    if (ok[x][u]) return; // 不加這句話超時了6組資料,說明資料有問題,不能保證是DAG
    ok[x][u] = true;
    for (auto v : g[u])
        dfs(x, v);
}

// 判斷每個點是否都可達x或x可達,如果是的話則x就是關鍵點
bool check(int x) {
    for (int i = 1; i <= n; i ++)
        if (!ok[x][i] && !ok[i][x])
            return false;
    return true;
}

int main() {
    cin >> n >> m;
    while (m --) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
    }
    for (int i = 1; i <= n; i ++) dfs(i, i);
    for (int i = 1; i <= n; i ++)
        if (check(i))
            cnt ++;
    cout << cnt << endl;
    return 0;
}