1. 程式人生 > 其它 >2021 年百度之星·程式設計大賽 - 初賽一. 鴿子

2021 年百度之星·程式設計大賽 - 初賽一. 鴿子

https://acm.hdu.edu.cn/showproblem.php?pid=6998

考慮每次操作能對答案產生的影響
記每次操作為\(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] << " ";
    }
}

我看見 你