1. 程式人生 > >[BZOJ3391][Usaco2004 Dec]Tree Cutting網絡破壞

[BZOJ3391][Usaco2004 Dec]Tree Cutting網絡破壞

code getc 直接 整數 bzoj etc style puts clu

Description

約翰意識到貝茜建設網絡花費了他巨額的經費,就把她解雇了.貝茜很憤怒,打算狠狠報 復.她打算破壞剛建成的約翰的網絡. 約翰的網絡是樹形的,連接著N(1≤N≤10000)個牛棚.她打算切斷某一個牛棚的電源,使和這個牛棚相連的所有電纜全部中斷.之後,就會存在若幹子網絡.為保證破壞夠大,每一個子網的牛棚數不得超過總牛棚數的一半,那哪些牛棚值得破壞呢?

Input

第1行:一個整數N. 第2到N+1行:每行輸入兩個整數,表示一條電纜的兩個端點.

Output

按從小到大的順序,輸出所有值得破壞的牛棚.如果沒有一個值得破壞,就輸出“NONE”.

Sample Input

10
1 2
2 3
3 4
4 5
6 7
7 8
8 9
9 10
3 8

Sample Output

3
8

如果牛棚3或牛棚8被破壞,剩下的三個子網節點數將是5,2,2,沒有超過5的.


如果是樹的話比較好處理...

直接dfs找就行了。

如果不是樹...

不會233


// By BriMon
#include <iostream>
#include <cstring>
#include <cstdio>
#include 
<vector> #include <algorithm> #include <queue> using namespace std; inline int read(){ int res=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)){res=(res<<3)+(res<<1)+(ch^48);ch=getchar();} return res; } #define N 10005 int
n; struct edge{ int nxt, to; }ed[N*2]; int head[N], cnt; inline void add(int x, int y) { ed[++cnt] = (edge){head[x], y}; head[x] = cnt; } bool ok[N]; int siz[N]; void dfs(int x, int fa) { siz[x] = 1; for (int i = head[x] ; i ; i = ed[i].nxt) { int to = ed[i].to; if (fa != to) { dfs(to, x); siz[x] += siz[to]; if (siz[to] > n / 2) ok[x] = false; } } if (n - siz[x] > n / 2) ok[x] = false; } int main() { n = read(); for (int i = 1 ; i < n ; i ++) { int x = read(), y = read(); add(x, y), add(y, x); } for (int i = 1 ; i <= n ; i ++) ok[i] = true; dfs(1, 0); bool flag = 0; for (int x = 1 ; x <= n ; x ++) if (ok[x]) printf("%d\n", x), flag = 1; if (!flag) puts("NONE"); return 0; }

[BZOJ3391][Usaco2004 Dec]Tree Cutting網絡破壞