HDOJ6986Kanade Loves Maze Designing(暴力,dfs树)
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ6986Kanade Loves Maze Designing(暴力,dfs树)相关的知识,希望对你有一定的参考价值。
1002 Kanade Loves Maze Designing 35.26%(880/2496)
题意:
- 给出一棵n个点的树,每个点有权值ci,记A(i,j)表示点i和j之间路径上的不同权值个数,求f(i,x)=∑(j=1->n) A(i,j)*x^{j−1},x=19560929, mod1=1e9+7, mod2=1e9+9.
思路:
- 因为n<2e3,可以n^2做,所以直接dfs暴力把所有的a[i][j] 枚举出来即可,O(n)枚举每个点,对于每个点dfs到其他所有点跑一遍O(n), 递归的时候开个数组记录路径上的不同权值个数,回溯的时候减掉即可。
- 对于最后的取模运算,因为多组数据所以可以提前预处理。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[2020][2020], c[2020];
vector<int>G[2020];
int rt, cnt, ma[2020];
void dfs(int x, int fa){
if(ma[c[x]]==0)cnt++;
ma[c[x]]++;
a[rt][x] = cnt;
for(int to : G[x]){
if(to!=fa)dfs(to,x);
}
ma[c[x]]--;
if(ma[c[x]]==0)cnt--;
}
const LL p1=1e9+7, p2=1e9+9;
LL pow2(LL a,LL b,LL mod){LL r=1;while(b){if(b&1)r=r*a%mod;a=a*a%mod;b>>=1;}return r%mod;}
LL x=19560929;
LL xa[2005],xb[2005];
int main(){
for(int i=0;i<=2000;i++)
xa[i]=pow2(x,i,1e9+7),xb[i]=pow2(x,i,1e9+9);
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T; cin>>T;
while(T--){
int n; cin>>n;
for(int i = 1; i <= n; i++)G[i].clear();//init
for(int i = 2; i <= n; i++){
int x; cin>>x;
G[i].push_back(x); G[x].push_back(i);
}
for(int i = 1; i <= n; i++)cin>>c[i];
for(int i = 1; i <= n; i++){
rt = i; dfs(i,0);
}
for(int i = 1; i <= n; i++){
LL ans1 = 0, ans2 = 0;
for(int j = 1; j <= n; j++){
ans1 = ((ans1+a[i][j]*xa[j-1]%p1)%p1+p1)%p1;
ans2 = ((ans2+a[i][j]*xb[j-1]%p2)%p2+p2)%p2;
}
cout<<ans1<<" "<<ans2<<"\\n";
}
}
return 0;
}
以上是关于HDOJ6986Kanade Loves Maze Designing(暴力,dfs树)的主要内容,如果未能解决你的问题,请参考以下文章
[HDOJ5094] Maze (记忆化搜索,BFS,状态压缩)
[HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)