給定乙個無根樹,求他的子樹的個數,子樹也是無根樹,邊和點一一對應即為相等子樹。
列舉子集,這樣就可以列舉出每種樹的構成,然後列舉根節點,dfs求出最小表示來判重。
注意,每乙個子集如果是樹的話,最多只能被計算一次,但是它的不同表示卻都要放到set裡(最小表示是對於確定根的)
然後如果他是森林的話,由於列舉子集從小到大,他的每棵樹都算過了,所以沒有問題
如果是在dfs中每一次都插入一次set,因為相同的子樹在set中的表示可能會不一樣,不好計數
必須枚舉子樹,把他們的表示都記錄下來,才好判重
換句話說,一顆n個節點的子樹,表示法應該是乙個n*(1 << n)個二進位制位才能表示。
樹的最小表示讓我想起很久之前學的乙個字串的最小表示
是用類似dfs序來進行描述的
以乙個節點為父節點的子樹的最小表示是:0,子樹的最小表示排序,1
就這樣。
#includeusing namespace std;
sets;
bool gra[20][20];
int visit[20];
int n;
string dfs(int u,int pre)
} sort(v.begin(),v.end());
for(int i = 0; i < v.size(); i++) cur = cur + v[i];
cur = cur + "1";
//cout << cur << ' ' << u << ' ' << pre << endl;
return cur;
}int main()
int ans = 0;
for(int i = 1; i < (1 << n); i++)
//for(int j = 1; j <= n; j++) printf("%d ",visit[j]);
//cout << endl;
int flag = 0;
for(int j = 0; j < n; j++)}}
ans = ans + flag;
} printf("case #%d: %d\n",cas,ans);
}}
HDU 3374(最小表示法)
題目鏈結 題意 給幾個字串,求每個字串的最小迴圈表示,最大迴圈表示 輸出序號最小的 以及出現的次數。思路 前面兩個直接用模板可求解。出現次數實際上就是問迴圈節的個數,這時我們可以想到kmp演算法中的nextval陣列。ac include include include includeusing n...
HDU 2609 最小表示法
題意 給定n個迴圈鏈 串 問有多少個本質不同的鏈 串 如果乙個迴圈鏈可以通過找乙個起點使得和其他串相同,那麼就認為這2個鏈是一樣的。就是求不同構的串 思路 對於求同構串可以用最小表示法,然後判斷是否相等就可以知道這2個是否是同構了。判重用的是set define crt secure no depr...
HDU 4162 最小表示法
題目 題意 給定乙個只有0 7數字組成的串。現在要由原串構造出乙個新串,新串的構造方法 相鄰2個位置的數字的差值。若為負數則要加上8,問新構造出來的串的乙個字典序最小同構串是什麼?思路 就按照題意構造出新串後,然後就是最小表示法了。define crt secure no deprecate inc...