問題 L 開會 樹的最小支配集

2021-08-31 11:40:30 字數 1638 閱讀 7081

時間限制: 1 sec  記憶體限制: 128 mb

提交: 111  解決: 20

[提交] [狀態] [討論版] [命題人:admin]

題目描述

開會,是對所有人時間的浪費,是對集體的**。

山區學校的一些學生之間的關係似乎好得有點過頭,以至於傳出了一些(在風紀委員們看來)不好的緋聞。具體地,有n個學生,n-1條緋聞,每條緋聞的主角都是倆學生。記者們的惡趣味保證任意兩個學生,可以通過若干條緋聞直接或間接地聯絡在一起。

於是學校打算邀請一些學生參加座談會。

校長相信,假如邀請了某位學生x來開會,那麼就能夠震懾到x本人,以及和x在同一條緋聞裡的學生們。

礦泉水是寶貴的,校長想知道最少需要請多少人來開會,才有可能震懾到所有同學。

輸入第一行是 n 表示學生數。 

之後n-1行,每行倆整數x,y,表示學生x和y之間有緋聞。( x≠y,但不一定x輸出

一行,乙個整數表示最少要邀請多少人。 

樣例輸入

5

1 35 2

4 33 5

樣例輸出

2
提示

可以選擇邀請學生2&3,或者是邀請學生3&5 

對於前10%的資料,n<=15

對於前30%的資料,n<=2000

對於接下來30%的資料,n<=10^5,且有倆學生需要通過n-1條緋聞才能扯上關係。

對於前100%的資料,n<=10^5,1<=x,y<=n

居然是板子題,嗯,板子還是很好理解的,可惜當時不知道

無向圖,兩倍的邊,所以邊開兩倍

一遍dfs,

求出某個點的父親,並且將dfs的順序放入棧中(需要反序)

那麼依次彈出棧中點

如果他沒被覆蓋(震懾),那麼標記他父親(這個就是被拉去開會的那個),這樣覆蓋(震懾)掉他,他父親,他父親的父親

棧空即結束

#includeusing namespace std;

typedef long long ll;

const int maxn = 1e5+7;

struct edgee[maxn<<1];//邊

int fa[maxn],head[maxn],st[maxn],now,cnt,n;//fa-father,head-鏈式前向星,st-棧,now-dfs序,cnt-鏈式前向星邊數,n-樹節點數

bool vis[maxn],set[maxn];//vis是-是否震懾某人,set是-某人去開會

int ans;//答案

void dfs(int x,int dad)

}void add(int u,int v);

head[u] = cnt++;

e[cnt] = ;

head[v] = cnt++;

}void init()

int main()

dfs(1,0);

while(now)

vis[top] = 1;//它

vis[fa[top]] = 1;//它父親

vis[fa[fa[top]]] = 1;//它爺爺}}

printf("%d\n",ans);

return 0;

}

樹的最小支配集

最小支配集,就是圖中用最少的點覆蓋其它所有點 如果用選a點覆蓋,則與a點相連的點都被覆蓋,大致 就是這樣 有乙個圖g,現在希望在一些點建立控制站,每個控制站能控制與它相臨的點 直接相連 現在希望有選擇的在一些點建立控制站,使得以最小得控制站數,控制所有的點 圖的最小支配集是np 問題,我只會樹的最小...

樹型DP求樹的最小支配集

樹型dp求樹的最小支配集 定義 支配集 形式上,支配集可描述如下 給定無向圖g v e 其中v 是大小為n 的點集,e 是邊集,那麼v 的乙個子集s稱為支配集當且僅當對於v s 中任何乙個點v 都有s 中的某個定點u 使得 u v e。最小支配集 對於圖g v,e 來說,最小支配集指的是從 v 中取...

poj 3659 樹形dp(樹上的最小支配集)

題意 求樹的最小支配集。思路 動態規劃。一開始每個點只取了兩個變數,表示在以其為根的子樹中選擇和不選擇該點的最少點數。由一組資料 6個點的路徑 發現了問題,考慮第3個點的時候,如果不選擇此點,那麼第4個點必須要選取,實際上這是不必的。該組資料的最優解是選擇第2和第5個點。dp1 x 表示選擇第x個點...