1 solutions

  • 0
    @ 2025-6-12 22:14:30

    先不考虑x出现的数量为偶数这个条件,用动态规划

    状态表示:f[i][j]f[i][j] 表示从SSjj经过ii条边的所有方案的数量

    状态划分:f[i+1][j]+=f[i][k]f[i + 1][j] += f[i][k], kk是所有j能到的点

    初始化:f[0][S]=1f[0][S] = 1

    答案:f[K][T]f[K][T]

    考虑x为偶数这个条件,多了一个限制,状态就要多一维

    状态表示:f[i][j][x]f[i][j][x]表示从SSjj经过ii条边,并且经过XX的次数模22的余数为xx的所有方案的数量

    状态划分:

    1. jj不为XX时,f[i+1][j][x]+=f[i][k][x]f[i + 1][j][x] += f[i][k][x], kk是所有j能到的点

    2. jjXX时,f[i+1][j][x]+=f[i][k][(x+1)f[i + 1][j][x] += f[i][k][(x+1)%2]

    初始化:f[0][S][0]=1f[0][S][0] = 1

    答案:f[K][T][0]f[K][T][0]

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long LL;
    
    const int N = 2010, M = N * 2;
    LL mod = 998244353;
    int h[N], e[M], ne[M], idx;
    vector<int> g[N];
    LL f[N][N][2];
    
    void add(int a, int b) { g[a].push_back(b); }
    
    int main() {
        int n, m, k, S, T, X;
        cin >> n >> m >> k >> S >> T >> X;
        while (m--) {
            int u, v;
            cin >> u >> v;
            add(u, v);
            add(v, u);
        }
    
        f[0][S][S == X] = 1;
        for (int i = 0; i <= k; i++)
            for (int j = 1; j <= n; j++)
                for (int x = 0; x < 2; x++) {
                    for (int k : g[j]) {
                        if (j != X)
                            f[i + 1][j][x] = ((LL)f[i + 1][j][x] + f[i][k][x]) % mod;
                        else
                            f[i + 1][j][x] = ((LL)f[i + 1][j][x] + f[i][k][(x + 1) % 2]) % mod;
                    }
                }
        cout << f[k][T][0];
        return 0;
    }
    

    Information

    ID
    673
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    (None)
    # Submissions
    42
    Accepted
    1
    Uploaded By