對於每個測試案例,給定三個整數 n、m 和 l,分別表示多米諾骨牌的數量、多米諾骨牌之間的關係數量和需要手動擊倒的多米諾骨牌數量。接下來的 m 行中,每行包含兩個整數 u 和 v,表示多米諾骨牌 u 倒下時會使多米諾骨牌 v 倒下。最後的 l 行中,每行包含一個整數 z,表示需要手動擊倒的多米諾骨牌。
計算在 l 個多米諾骨牌被擊倒後,倒下的多米諾骨牌的總數。
思路:DFS / BFS
首先根據題意,可以建立一個有向圖,其中每個多米諾骨牌 u 都有一個 鄰接表(Adjacency List) g[u],其中包含所有會因為 u 倒下而倒下的多米諾骨牌。
intdfs(int u){ visited[u] = true; int res = 1; for (int v : g[u]) { if (!visited[v]) { res += dfs(v); } } return res; } intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t, n, m, l, u, v, z; cin >> t; while (t--) { cin >> n >> m >> l; g.clear(); g.resize(n); for (int i=0; i<m; i++) { cin >> u >> v; g[u-1].push_back(v-1); } int ans = 0; visited.assign(n, false); for (int i=0; i<l; i++) { cin >> z; if (!visited[z-1]) { ans += dfs(z-1); } } cout << ans << endl; } return0; }
寫在最後
Cover photo is remixed from @Ice maker, thanks for their work!
一開始以為是每次推倒都需要重新計算,並給出從 z 開始,能夠被推倒多米諾骨牌數量。但其實是連續 l 次推倒,並計算推倒後的多米諾骨牌總數。還是要好好讀題啊!