2021 年百度之星·程式設計大賽 - 初賽一. 鴿子
阿新 • • 發佈:2021-08-07
考慮每次操作能對答案產生的影響
記每次操作為\(swap(a,b)\),dp[i]表示答案,初始化位-1表示狀態不可達,開始時dp[k] = 0.
- a不可達
- b可達 dp[v] = dp[u], dp[u] := dp[u] + 1.
- b不可達 無影響.
- a可達
- b可達 dp[v] = min(dp[v] + 1, dp[u]) dp[u] = min(dp[u] + 1,dp[v]).
- b不可達 dp[u] = dp[v], dp[v] := dp[v] + 1.
我看見 你const int maxn = 1e6 + 7; int n, t, m, k; int dp[maxn]; void solve() { cin >> t; while (t--) { cin >> n >> m >> k; memset(dp, -1, sizeof dp); dp[k] = 0; for (int i = 1, u, v; i <= m; i++) { cin >> u >> v; int su = dp[u], sv = dp[v]; if (su == -1 && sv == -1) continue; if (su == -1) dp[v] = sv + 1, dp[u] = sv; if (sv == -1) dp[u] = su + 1, dp[v] = su; if (su != -1 && sv != -1) dp[u] = min(sv, su + 1), dp[v] = min(su, sv + 1); } for (int i = 1; i <= n; i++) i == n ? cout << dp[i] << "\n" : cout << dp[i] << " "; } }