洛谷P2419 [USACO08JAN]Cow Contest S 題解 DAG上的簡單搜尋
阿新 • • 發佈:2021-11-18
題目連結: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; }