xcoj1226-捕鼠

题目链接

题目描述

GX养的一只仓鼠最近跑进了一个神秘的城堡里,他准备在这个有n个房间的城堡中抓捕他的仓鼠,他在房间0放了一块食物,根据抓鼠攻略,这块食物可以吸引距离它D的仓鼠,但是仓鼠还是没有出现,现在给你一张这个城堡的地图,上面标有各个房间的关系,已知每个房间都相连且距离为1,GX想知道他的仓鼠可能出现在哪些房间,请输出这些房间的总数

输入

第一行输入n(0< n <=100000)和D(0< D < n)
接下来的n-1行为房间的连接关系,每行有两个数x,y代表房间x与房间y相邻

输出

对于每组数据,输出一个数,表示仓鼠可能出现的房间的数量

样例输入

10 2
0 1
0 2
0 3
1 4
1 5
2 6
3 7
4 8
6 9

样例输出

2

思路

因为题中说明有n个房间和n-1条通道,故可以将它们看成一棵树,然后运用从房间0开始,运用深度优先搜索或者广度优先搜索进行遍历深度为D的房间,并统计数量。

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include <fstream>
using namespace std;

int d;
int count;
vector<int> edges[100005];
bool vis[100005];

//深度优先遍历
void dfs(int v, int step)
{
    if(step == d)
    {
        return ;
    }
    else
    {
        vis[v] = true;
        count ++;
        for(int i = 0; i < edges[v].size(); ++ i)
        {
            if(!vis[edges[v][i]])
            {
                dfs(edges[v][i], step + 1);           
            }
        }
    }
}

int main()
{
    //ifstream cin("data.in");
    int n;
    while(cin >> n >> d)
    {
        count = 0;
        d ++;
        memset(vis, false, sizeof(bool) * n);
        for(int i = 0; i < n; i ++)
        {
                edges[i].clear();//注意初始化,负责会出错
        }
        for(int i = 0; i < n-1; ++ i)
        {
            int x, y;
            cin >> x >> y;
            edges[x].push_back(y);
        }
        dfs(0, 0);
        cout << n - count << endl;//count为以遍历的房间,即距离房间0距离小于等于D的房间
    }
    return 0;
}
posted @ 2016-09-20 20:31  zq216991  阅读(119)  评论(0编辑  收藏  举报