Road of the King 题解
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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号