题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4707
【题意】:linji的仓鼠丢了,他要找回仓鼠,他在房间0放了一块奶酪,然后给出房间的相邻关系,相邻的房间距离为1,题目给出奶酪能吸引仓鼠的最大距离 D,然后求出有多少房间可能是仓鼠所在的位置,也就是求有多少个房间距离 房间0 的距离 大于D。
【分析】
网上有很多dfs的代码,我认为大多都有错误,他们的代码都默认了这一条件: 输入相邻的两个房间, 先输入的房间 距离房间0最近,然而题目并没说他们的先后,条件仅仅是相邻;所以需要将两种情况都放在vector中去做,用vis标记,先扫描到的先标记。
否则改变输入顺序,就会输出错误结果;
根据vector动态数组的特点,我们可以用vector来构造树,然后用dfs,或者bfs遍历整棵树就好了;
【dfs】
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100010; bool vis[maxn]; struct Nod{//将距离dis和数据放在一个结构体 int b,dis; }tnd; vector <Nod> G[maxn]; int ans; void dfs(int s,int dis){ int i; vis[s]=true; if(dis<0) ans++;//超过距离就加1; for(int i=0;i<G[s].size();i++){ int id= G[s][i].b;//每一组所属的i,就是之前这一维push_back()来的; if(vis[id]) continue; dfs(id,dis-1); } } int main() { int t; scanf("%d",&t); while(t--) { memset(vis,false,sizeof(vis)); int n,d; scanf("%d%d",&n,&d); int i; ans=0; for(i=0;i<n;i++) { G[i].clear(); } for(i=0;i<n-1;i++){ int a,b; scanf("%d%d",&a,&b); tnd.b=b; tnd.dis=0; G[a].push_back(tnd);//a,b都推入对应vector这样就确定了相邻的情况了 tnd.b=a; G[b].push_back(tnd);//push_back 操作就把当前vector维数扩展一维; } dfs(0,d); printf("%d\n",ans); } return 0; }
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int MAXN = 1000010; vector<int>vec[MAXN]; int dep[MAXN]; void bfs(int s) { memset(dep,-1,sizeof(dep));//深度初始化为-1 dep[s] = 0; queue<int>q; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); int sz = vec[u].size(); for(int i = 0;i < sz;i++) { int v = vec[u][i]; if(dep[v] != -1)continue;//同理,标记过就continue; dep[v] = dep[u] + 1;//一层层加深 q.push(v); } } } int main() { int T; int n; int D; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&D); int u,v; for(int i = 0;i < n;i++) vec[i].clear(); for(int i = 1;i < n;i++) { scanf("%d%d",&u,&v); vec[u].push_back(v);//同理相互储存 vec[v].push_back(u); } bfs(0); int ans = 0; for(int i = 0;i < n;i++) if(dep[i] > D) ans++; cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/chaiwenjun000/article/details/46551629