国产探花免费观看_亚洲丰满少妇自慰呻吟_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 -- ) {
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天柱县| 固安县| 东乌珠穆沁旗| 沅江市| 贡觉县| 苍山县| 新昌县| 合山市| 故城县| 临颍县| 吉木萨尔县| 友谊县| 长岛县| 赤峰市| 五常市| 明星| 双流县| 冕宁县| 普安县| 湖南省| 泰安市| 哈密市| 平和县| 广平县| 江西省| 西充县| 阜平县| 铁岭市| 友谊县| 武清区| 霍城县| 沽源县| 鸡东县| 从江县| 凌海市| 黔江区| 裕民县| 宾川县| 林甸县| 中西区| 林西县|