bzoj 3033 太鼓达人——欧拉图搜索
生活随笔
收集整理的這篇文章主要介紹了
bzoj 3033 太鼓达人——欧拉图搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=3033
思路:肯定是把2^m個數當成點,每個點連了2條入邊、2條出邊,然后求一個經過所有點一次的路徑。
但是這怎么做?又不是歐拉路的定義。
肯定是把點變成邊,于是一條邊會連4條邊,就用點把它們粘起來就能求個歐拉路了。
然后覺得這不是個歐拉圖吧? >o-o< 了以后,把右邊的兩條邊轉一轉連一連,好像得出每個點連5條邊的結論?(3條邊)
怎么辦?TJ:https://blog.csdn.net/Clove_unique/article/details/70160122
原來是這樣啊。分析一下點和邊的含義,以點為中心分析它的度數。得出:這就是個歐拉圖。
然后怎么求歐拉路?
竟然是暴搜。
有一些細節。比如dfs什么時候到終點之類的。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=(1<<10)+5,M=(1<<11)+5; int m,lm,mod; bool vis[M],flag,ans[M]; void dfs(int nw,int k)//在第k位 {if(k==m+lm){flag=1;return;}if(k<=lm)for(int i=0;i<=1;i++){int s=((nw<<1)|i);if(vis[s])continue; ans[k]=i;vis[s]=1; dfs(s&mod,k+1);if(flag)return; vis[s]=0;}else{int s=((nw<<1)|ans[k-lm]);if(vis[s])return;vis[s]=1;dfs(s&mod,k+1);if(flag)return; vis[s]=0;} } int main() {scanf("%d",&m);mod=(1<<(m-1));lm=(mod<<1);mod--;printf("%d ",lm);for(int s=0;s<lm;s++){dfs(s,m);if(flag)break;}for(int i=1;i<=lm;i++)printf("%d",ans[i]);return 0; }?
轉載于:https://www.cnblogs.com/Narh/p/9283081.html
總結
以上是生活随笔為你收集整理的bzoj 3033 太鼓达人——欧拉图搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3Dmax怎么创建壮观的三维空间爆炸效果
- 下一篇: 国内敏捷项目协作工具亲测推荐