原題: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來儲存該...