poj 2378 Tree Cutting

来源:互联网 发布:silver是什么软件 编辑:程序博客网 时间:2024/06/08 04:48
邻接表建树,然后DFS求节点的孩子数。枚举被去掉的节点,去掉之后树变成了父节点和各个孩子组成的块,查询各个块的节点数即可
import java.util.*;import java.io.*; class edge{       int from,to,next;       public edge(int a, int b, int c){              from=a;to=b;next=c;       }}class problem{    int n;    edge arr[];    int header[];    int sons[];    int level[];    int edge_num = 0;    void solver() throws IOException{        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        StringTokenizer st = new StringTokenizer(reader.readLine());        n = Integer.parseInt(st.nextToken());        arr = new edge[2*n+1];        sons = new int[n+1];        level = new int[n+1];        header = new int[n+1];        Arrays.fill(sons, -1);        Arrays.fill(header, -1);        for(int i=2;i<=n;i++){            st = new StringTokenizer(reader.readLine());            int t1 = Integer.parseInt(st.nextToken());            int t2 = Integer.parseInt(st.nextToken());                       arr[edge_num] = new edge(t1,t2,header[t1]);            header[t1] = edge_num++;            arr[edge_num] = new edge(t2,t1,header[t2]);            header[t2] = edge_num++;        }        for(int i=1;i<=n;i++){              if(sons[i]==-1) dfs(i,1);        }        for(int i=1;i<=n;i++){                     int t1 = sons[1]-sons[i];              if(t1>n/2) continue;              boolean flag = true;              for(int j=header[i];j!=-1;j=arr[j].next){                  int to = arr[j].to;                  if((level[to]>level[i])&&(sons[to]+1)>n/2) flag = false;              }              if(flag) System.out.println(i);        }         }    int dfs(int pos, int l){       int sum=0;       level[pos] = l;       for(int i=header[pos];i!=-1;i=arr[i].next){           if(level[arr[i].to]==0){               sum+=dfs(arr[i].to,l+1)+1;           }       }       sons[pos]=sum;       return sum;    }}public class fence8 {    public static void main (String [] args) throws Exception {        problem p = new problem();        p.solver();    }}

0 0