• 算法问题实战策略 GALLERY


    地址 https://algospot.com/judge/problem/read/GALLERY

     分析

    如图 显然是需要在 0 1 2三个点进行监控即可。(0 2 3 也可)

    根据题意,不存在回路,也就是不重复经过两画廊之间的走廊是不可能在两画廊之间进行走动的

    我们可以将该图看成一棵树,深度优先遍历时,叶子结点的父节点需要放置摄像头,这样能将叶子结点 父节点和父节点的父节点均可监视到。然后根据有无未监视的子节点 决定当前节点的状态(需要放置,被监视,未被监视)

    代码如下

     1 #include <iostream>
     2 #include <vector>
     3 
     4 
     5 using namespace std;
     6 
     7 const int N = 10010;
     8 int V;
     9 vector<int> adj[10010];
    10 vector<bool> visited;
    11 const int UNWATCHED = 0;
    12 const int  WATCHED = 1;
    13 const int INSTALLED = 2;
    14 
    15 int installed;
    16 
    17 int dfs(int here)
    18 {
    19     visited[here] = true;
    20     int children[3] = { 0,0,0 };
    21     for (int i = 0; i < adj[here].size(); i++)
    22     {
    23         int there = adj[here][i];
    24         if (!visited[there])
    25             ++children[dfs(there)];
    26     }
    27 
    28     //后代节点存在没有监视的节点 在该节点安装摄像头
    29     if (children[UNWATCHED]) {
    30         ++installed;
    31         return INSTALLED;
    32     }
    33 
    34     if (children[INSTALLED]) {
    35         return WATCHED;
    36     }
    37 
    38     return UNWATCHED;
    39 }
    40 
    41 int installCamera()
    42 {
    43     installed = 0;
    44     visited = vector<bool>(V, false);
    45     for (int u = 0; u < V; ++u) {
    46         if (!visited[u] && dfs(u) == UNWATCHED)
    47             ++installed;
    48     }
    49 
    50     return installed;
    51 }
    52 
    53 
    54 
    55 /*
    56 3
    57 6 5
    58 0 1
    59 1 2
    60 1 3
    61 2 5
    62 0 4
    63 4 2
    64 0 1
    65 2 3
    66 1000 1
    67 0 1
    68 =====================
    69 3
    70 2
    71 999
    72 */
    73 
    74 int main()
    75 {
    76     int sampleCount = 0;
    77     cin >> sampleCount;
    78     while (sampleCount--) {
    79         int n, m; visited.clear();
    80         for (int i = 0; i < 10010; i++) adj[i].clear();
    81         cin >> V >> m;
    82         for (int i = 0; i < m; i++) {
    83             int a, b;
    84             cin >> a >> b;
    85             adj[a].push_back(b); 
    86             adj[b].push_back(a);
    87         }
    88         cout << installCamera() << endl;
    89     }
    90 
    91     return 0;
    92 }
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Android 联系人中使用的常量
    Android 获取联系人Uri
    Android 编辑联系人
    Android 删除联系人
    Android 联系人添加
    Android 联系人查询
    CollectionViewMasonryLayout
    centos7搭建redis
    centos7搭建zookeeper
    排序算法
  • 原文地址:https://www.cnblogs.com/itdef/p/11783990.html
Copyright © 2020-2023  润新知