题解:CF288B Polo the Penguin and Houses
立柱已选162534 · · 题解
不是你们都在写啥啊.jpg
显然不可能有
首先考虑比较简单的
然后考虑
从
:::info[我的唐诗做法]
枚举环长
然后我不会求和,我觉得这个要求和基本上就和正确观察思路相同了。(有没有大手子会直接做) :::
感谢 @SalN 和 @CharlieCai 的指点。
:::info[正确的观察]
考虑将这棵基环树拆成一棵以
于是,这题能够被加强到
代码,虽然和其他题解都是一样的
:::info[附上搜索代码] 直接搜:
int p[10];
bool pd;
void dfs(int c){
if(c==k+1){
for(int i=1,x;i<=k;++i){
x=i;pd=0;
for(int j=1;j<=k;++j)x=p[x],pd|=(x==1);
if(!pd)return;
}
++ans;
return;
}
for(int i=1;i<=k;++i)p[c]=i,dfs(c+1);
}
时间复杂度介于
根据连通块数量等于环数量的搜索:
int p[10],vis[10];
void dfs(int c){
if(c==k+1){
memset(vis,0,sizeof(vis));
int x=1;
while(!vis[x])vis[x]=1,x=p[x];
if(x!=1)return;//判断 1 是否在环上
for(int i=1;i<=k;++i)
if(!vis[i]){
x=i;
while(!vis[x])vis[x]=i,x=p[x];
if(vis[x]==i)return;//判断是否产生了新的环,若产生则代表图不连通
}
++ans;
return;
}
for(int i=1;i<=k;++i)p[c]=i,dfs(c+1);
}
时间复杂度为