Road of the King 题解
形成强连通图的必要条件是点 \(1\) 能在环中,于是考虑 \(1\) 号点形成的强连通分量 \(x\)。 这类图论计数题目往往考虑 dp,于是我们设 \(dp_{i,j,k}\) 表示走了 \(i\) 步,经过了 \(j\) 个点,\(1\) 号点形成的强连通分量 \(x\) 的大小为 \(k\) 时的方案数。转移方程是容易的。
其实本题如果想到了考虑 \(1\) 号点形成的强连通分量 \(x\) 就很简单了。
代码:
#include <bits/stdc++.h>
#define N 302
#define int long long
#define mod 1000000007
using namespace std;
int n, m;
int dp[N][N][N];
void add(int &x, int y) {
x = (x + y) % mod;
}
signed main() {
cin >> n >> m;
dp[0][1][1] = 1;
for (int i = 0; i < m; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++) {
add(dp[i + 1][j + 1][k], dp[i][j][k] * (n - j) % mod);
add(dp[i + 1][j][j], dp[i][j][k] * k % mod);
add(dp[i + 1][j][k], dp[i][j][k] * (j - k) % mod);
}
cout << dp[m][n][n] << "\n";
return 0;
}
标签:King,连通,int,题解,号点,Road,dp
From: https://www.cnblogs.com/Rock-N-Roll/p/18409056