国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[Educational Codeforces Round 17 F (762F)] Tree nesting

2019-11-14 10:02:53
字體:
來源:轉載
供稿:網友

題意

我把educational round 理解為 eazy round真是too young too simple,明明是 be educated round

給定兩棵樹S,T,|S|≤1000,|T|≤12 詢問S中有多少個子圖(我覺著講子樹不太形象吧)與T同構。

題解

樹的同構問題一般都是牽扯到最小表示法的。

官方題解給出了一個trick,同構的樹總有一個點或一條邊位置不變,也就是樹的中心,或者兩個中心之間的邊。 按照題解的說法,求以中心為樹根的最小表示,然后在S中枚舉點做樹根統計得到T最小表示的方案數? 不太會寫。 于是去膜了一發毛爺爺。

首先,求出T以每個點為根的最小表示,具體方法為用1表示進入一棵子樹,0表示離開一棵子樹,01串就能表示一整棵樹,最小表示要求每個節點都要對兒子們的最小表示排個序,然后拼起來成為這棵子樹的最小表示。在這個過程中記錄下來所有的狀態(包含子樹狀態)。

再然后就是dfs一遍S樹了。先dfs兒子們,使兒子們求出得到記錄中的各個狀態( 遍歷S時得到的狀態們)的方案數。然后枚舉當前節點的所有狀態,每個狀態都要求這個節點有一定的狀態集合,這時通過枚舉所有的兒子的所有狀態進行dp。具體實現比較復雜,詳見代碼。

另外,原來c++11用著這么爽,編譯命令加個-std=c++11就行了(似乎需要gcc4.8.x以上?我是gcc4.9.2)。

代碼

/// by ztx/// blog.csdn.net/hzoi_ztx/// learnt from myy (matthew99:http://codeforces.com/contest/762/submission/24128833)#define Rep(i,l,r) for(i=(l);i<=(r);i++)#define rep(i,l,r) for(i=(l);i< (r);i++)#define r(x) read(x)typedef long long ll ;int CH , NEG ;template <typename TP>inline void read(TP& ret) { ret = NEG = 0 ; while (CH=getchar() , CH<'!') ; if (CH == '-') NEG = true , CH = getchar() ; while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ; if (NEG) ret = -ret ;}using namespace std; #define kN 1000LL#define kM 12LL#define pb push_back#define kMod 1000000007LLint n, m, ANS;int now[(1<<kM)+5], nxt[(1<<kM)+5];vector<int> G[kN+5], g[kM+5];map<int,vector<int> > STA;map<int,int> ans[kN+5];inline int blen(int x) { return 32 - __builtin_clz(x); } // __builtin_clz() count leading zerosinline int combine(int x, int y) { return x << blen(y) | y; }inline void P(int x) { for (int i = 30; ~i; i -- ) {
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 常德市| 淮北市| 高清| 醴陵市| 阳西县| 宁国市| 田阳县| 西畴县| 城市| 鸡西市| 志丹县| 昔阳县| 寿阳县| 乐东| 达州市| 托里县| 佛教| 东兴市| 随州市| 拜泉县| 保定市| 赣榆县| 会理县| 萝北县| 禹州市| 岑溪市| 海口市| 什邡市| 时尚| 隆子县| 湟中县| 长治县| 闻喜县| 通渭县| 蒙山县| 阳原县| 巨野县| 红河县| 蓬安县| 弥渡县| 岳池县|