zoukankan      html  css  js  c++  java
  • HDU 5927 Auxiliary Set (dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5927

    题意:

            给你一棵树,其中有一些’不重要‘的点,要是这些’不重要‘的点的子树中有两个重要的点的LCA是这个点,那么这个点就是重要的点。每次询问 问你重要的点有多少?

    思路:

            用不重要的点建图,要是这个不重要点上的相邻子树至少有两个有重要的点不在同一子树上,那么这个不重要的点才变成重要的点。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <vector>
      5 #include <map>
      6 using namespace std;
      7 const int N = 1e5 + 5;
      8 vector <int> G[N];
      9 int d[N], a[N], par[N], d2[N], cnt, son[N];
     10 bool vis[N];
     11 //son[u]表示u节点相邻的子树个数
     12 //原图:d[u]表示以u节点为root的子树节点个数
     13 //不重要点建的图:d2[u]表示以u节点为root的子树节点个数
     14 //cnt表示不重要的点的个数
     15 
     16 void init(int n) {
     17     for(int i = 1; i <= n; ++i) {
     18         G[i].clear();
     19         vis[i] = false;
     20     }
     21 }
     22 
     23 void dfs1(int u, int p) {
     24     d[u] = 1;
     25     par[u] = p;
     26     son[u] = 0;
     27     for(int i = 0; i < G[u].size(); ++i) {
     28         int v = G[u][i];
     29         if(v == p) 
     30             continue;
     31         dfs1(v, u);
     32         d[u] += d[v];
     33         ++son[u];
     34     }
     35 }
     36 
     37 void dfs2(int u) {
     38     d2[u] = 1;
     39     vis[u] = true;
     40     int num = 0, num2 = 0;
     41     for(int i = 0; i < G[u].size(); ++i) {
     42         int v = G[u][i];
     43         if(!vis[v])
     44             dfs2(v);
     45         d2[u] += d2[v];
     46         if(d[v] > d2[v]) {
     47             ++num;
     48         }
     49         num2++;
     50     }
     51     if(num + (son[u] - num2) > 1) //符合条件 (不同子树中重要点)>=2;
     52         return ;
     53     else
     54         cnt++;
     55 }
     56 
     57 int main()
     58 {
     59     int t, n, m, u, v, q;
     60     scanf("%d", &t);
     61     for(int ca = 1; ca <= t; ++ca) {
     62         scanf("%d %d", &n, &m);
     63         init(n);
     64         for(int i = 1; i < n; ++i) {
     65             scanf("%d %d", &u, &v);
     66             G[u].push_back(v);
     67             G[v].push_back(u);
     68         }
     69         printf("Case #%d:
    ", ca);
     70         dfs1(1, 0);
     71         init(n);
     72         while(m--) {
     73             scanf("%d", &q);
     74             for(int i = 1; i <= q; ++i) {
     75                 scanf("%d", a + i);
     76                 vis[a[i]] = true;
     77             }
     78             for(int i = 1; i <= q; ++i) {
     79                 if(vis[par[a[i]]]) {
     80                     G[par[a[i]]].push_back(a[i]);
     81                 }
     82             }
     83             for(int i = 1; i <= q; ++i) {
     84                 vis[a[i]] = false;
     85             }
     86             cnt = 0;
     87             for(int i = 1; i <= q; ++i) {
     88                 if(!vis[a[i]]) {
     89                     dfs2(a[i]);
     90                 }
     91             }
     92             for(int i = 1; i <= q; ++i) {
     93                 vis[a[i]] = false;
     94                 G[a[i]].clear();
     95             }
     96             printf("%d
    ", n - cnt);
     97         }
     98     }
     99     return 0;
    100 }
  • 相关阅读:
    java学习笔记(4)多态
    scala学习笔记(1)
    java复习(3)继承下
    java复习(3)继承
    java复习(2)
    java中常见的异常种类
    数组的内存结构
    Castle ActiveRecord学习(一)简介
    OAuth2.0 Owin 授权问题
    将对象转为json,加入到HttpResponseMessage中
  • 原文地址:https://www.cnblogs.com/Recoder/p/5935072.html
Copyright © 2011-2022 走看看