TZOJ 7889: 小B旅游
描述
小B在一个有N个城市M条道路的国家,每条道路连接的城市可以互相到达且每条道路小B都要花1步去走过它。现在他在1号城市,问他走P步最多能走多少个不同的城市?
输入
第1行,三个正整数N、M、P
接下来M行,每行两个整数U、V,表示存在一条连接U、V的无向边。
1<=N<=100000,1<=M<=1000000,1<=P<=10000
输出
输出格式:1行,一个整数,表示从1号城市出发走P步的所有情况,共能经过多少个不同的城市。
样例输入
4 4 2
1 2
1 3
2 3
3 4
样例输出
4
不能直接用二维数组构图,会溢出,所以使用vector将输入的边存入,bfs就是从起点1出发去找每一个相邻且没走过且还有步数的城市加入到队列中,并将该城市标记,最后搜索完后去标记数组vis中查找有多少城市被标记就是有多少城市能走
#include <bits/stdc++.h> using namespace std; struct node{ int x,y,step; }; node q[1000001]; vector<int> g[100001]; int vis[100001]; int n,m,p,step,ans; void bfs() { int head = 1,tail = 1; vis[1] = 1; q[tail].x = 1; q[tail].step = 0; tail++; while(head<tail) { for(int i=0;i<g[q[head].x].size();i++) { int tx = g[q[head].x][i]; if(vis[tx]==0 && q[head].step<p) { vis[tx] = 1; q[tail].x = tx; q[tail].step = q[head].step+1; tail++; } } head++; } } int main() { cin>>n>>m>>p; for(int i=1;i<=m;i++) { int x,y; scanf("%d %d",&x,&y); g[x].push_back(y); g[y].push_back(x); } bfs(); for(int i=1;i<=n;i++) if(vis[i]==1)ans++; cout<<ans; return 0; }