zoukankan      html  css  js  c++  java
  • Codeforces 796D Police Stations

    题目链接

    https://codeforces.com/contest/796/problem/D

    题目大意

    给你一颗包含 N 节点的树,其中有 K 个节点为关键点。

    问在满足所有点和关键点的距离 <= d 的前提下最多可以删除多少条路径

    解题思路

    思维 + BFS

    相对简单的一道题吧?

    将每个关键点加入队列,一边进行BFS一边记录路径

    直到所有点都被访问过再把没记录过的路径输出即可

    AC_Coder

    #include<bits/stdc++.h>
    #define rep(i,a,n) for (int i=a;i<=n;i++)
    #define pb push_back
    #define fi first
    #define se second
    #define int long long
    using namespace std;
    const int N = 3e5 + 10;
    vector<pair<int , int>>mat[N];
    int a[N];
    queue<int>que;
    int vis1[N] , vis2[N] , cnt , n , k , d , ans;
    void bfs()
    {
        while(!que.empty())
        {
            int now = que.front();
            que.pop();
            if(cnt == n) break ;
            for(auto i : mat[now])
            {
                if(vis1[i.fi] || vis2[i.se]) continue ;
                vis1[i.fi] = 1 , vis2[i.se] = 1;
                que.push(i.fi);
                cnt ++ , ans ++ ;
            }
        }
    }
    signed main()
    {
        cin >> n >> k >> d;
        rep(i , 1 , k) 
        {
            cin >> a[i];
            if(vis1[a[i]]) continue ;
            cnt ++ , que.push(a[i]) , vis1[a[i]] = 1;
        }
        rep(i , 1 , n - 1)
        {
            int u , v;
            cin >> u >> v;
            mat[u].pb(make_pair(v , i)) , mat[v].pb(make_pair(u , i));        
        }
        bfs();
        cout << n - 1 - ans << '
    ';
        rep(i , 1 , n - 1)
            if(!vis2[i]) cout << i << " ";
        return 0;
    }
    凡所不能将我击倒的,都将使我更加强大
  • 相关阅读:
    数据库操作
    jquery 第一章
    算法很美 第一章
    python 学习第四天
    python学习第三天
    python学习第二天
    学习python的第一天
    C#-线程
    C#-流、存储
    C#-集合
  • 原文地址:https://www.cnblogs.com/StarRoadTang/p/13026221.html
Copyright © 2011-2022 走看看