時間限制: 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個點...