切割樹 無根樹轉為有根樹

2021-08-18 09:39:06 字數 1110 閱讀 7254

原題:1325

題意

給乙個無根樹,輸出所有點,滿足刪了這個點後剩下各個部分結點數不超過n/2

解析

知道轉變成有根樹的話,問題就直接解決了

首先用setson[i]存與i連線的結點,而且因為無根樹的隨便乙個結點都可以當root,我們便選擇第乙個輸入的作為root

對於每個father,把所有兒子的set裡面的出現的father刪除,那麼son的意義就從連線點變成了兒子集合了。 *如果需要確定father,可以在這個時候確定

變成了有根樹,那麼接下來只要類似dfs一遍,就可以得到乙個結點所在子樹的結點數了

**

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,root;

setson[10009];

int val[10009];

void build(int ro)

}int count(int ro)

return ans;

}int main()

for(int i=1;iint a,b;scanf("%d%d",&a,&b);

if(i==1)root=a;

son[a].insert(b);

son[b].insert(a);

}build(root);

val[root]=count(root);

int op=n/2;

for(int i=1;i<=n;i++)

}if(f)printf("%d\n",i);

}else

}if(f)printf("%d\n",i);

}}}/*

101 2

2 33 4

4 56 7

7 88 9

9 10

3 8*/

無根樹轉有根樹

乙個n n 1000000 個結點的無根樹的各條邊,並指定乙個根結點,要求把樹轉化為有根樹。輸入 結點的數目n,無根樹的各條邊,輸入乙個根結點號。輸出 各個結點的父親編號。執行結果 演算法實現 為方便起見,我們用了stl中的vector來儲存邊,g u 表示u結點的相鄰結點的編號。樹的儲存結構定義 ...

無根樹變為有根樹

即無環連通無向圖 若乙個圖中每條邊都是無方向的,則稱為無向圖。無根樹它要求每個頂點之間都直接或間接相連,且圖中無環,即只有簡單路徑。由於樹是圖的子集,這一類圖具有樹的特徵,但不具有樹狀的形式,沒有特定的根節點,故稱為無根樹。任意選取圖中某個點為根,均可將無根樹轉化為有根樹。includeusing ...

無根樹轉有根樹

輸入乙個n個節點的無根樹的各條邊,並指定乙個根節點,要求把該樹轉化為有根樹,輸出各個節點的父節點編號。樹是一種特殊的圖,因此可以使用鄰接矩陣來表示。如果使用二維陣列來儲存鄰接矩陣,則需要o n2 個元素的空間,因此改用vector陣列。從根節點開始對樹進行dfs。遍歷到每個節點時,使用陣列p來儲存該...