题意
- 给定一棵树,n个节点,你有k种颜色,对于任意相同颜色的点对,两个点之间的路径必须都和这两个点颜色相同,统计合法的染色方案个数
思路
- 由于树是连通的,所以如果要满足条件,一个节点的颜色要不然是一个全新的无人使用的颜色,要不然和自己的父亲相同
- 计数,考虑dp,
表示前i个节点使用了j种颜色,转移方程 )&preview=true)
代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
ll dp[400][400];
vector<int> G[500];
const int p=1e9+7;
int main(){
int n,k;
cin >> n >> k;
for(int i=0;i<n;i++){
int x,y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
dp[i][j]=(dp[i-1][j-1]*(k-(j-1)))%p+dp[i-1][j]%p;
}
}
ll ans=0;
for(int i=1;i<=k;i++){
ans=(ans+dp[n][i])%p;
}
cout << ans << endl;
return 0;
}