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;
}

 

posted @ 2022-12-09 11:06  CRt0729  阅读(76)  评论(0编辑  收藏  举报