zoukankan      html  css  js  c++  java
  • 算法问题实战策略 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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    koa2环境搭建
    单例模式
    nodejs fs path
    path node
    webpack code splitting
    babel 插件编写
    C#验证码类
    C#身份证识别相关技术
    C# Socket服务端与客户端通信(包含大文件的断点传输)
    动态抓取网页信息
  • 原文地址:https://www.cnblogs.com/itdef/p/11783990.html
Copyright © 2011-2022 走看看