题意:给一棵树进行染色,并且要保证(x,y)成立,也就是从X节点到y节点的颜色相同
题解:因为题目没有对节点进行要求(虽然给定节点的边的关系)
此题看上去是一个染色,其实任意两个相同颜色的点对,之间都的一个颜色,那就是一个联通分量全是一个颜色。
树,就可以看做是一个点集合,挑哪些点染同一种颜色。显然是DP做法。
每一个点跟前一个点的关系只有颜色相同、颜色不同两种,当颜色相同时,该点的方案数等于上一个点方案数,当颜色不同时,只能使用剩余的 种颜色,所以
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
ll dp[500][500];
int main()
{
int n, m;
cin >> n >> m;
dp[0][0] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
dp[i][j] = dp[i - 1][j - 1] * (m - j + 1);
dp[i][j] = dp[i][j] % MOD;
dp[i][j] += dp[i - 1][j];
dp[i][j] = dp[i][j] % MOD;
}
}
ll sum = 0;
for(int i = 1; i <= m; i++)
{
sum += dp[n][i];
sum = sum % MOD;
}
cout << sum <<endl;
return 0;
} 
京公网安备 11010502036488号