hdu 4013樹的最小表示

2021-07-22 16:16:41 字數 1107 閱讀 9888

給定乙個無根樹,求他的子樹的個數,子樹也是無根樹,邊和點一一對應即為相等子樹。

列舉子集,這樣就可以列舉出每種樹的構成,然後列舉根節點,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...