4.7 每日一题题解

珂朵莉的无向图

涉及知识点:

  • BFS

solution:

  • 真正掌握了BFS的应该可以一眼看出来这是BFS模板题吧~
  • 找了篇包含好多BFS题目的博客https://www.cnblogs.com/tigerisland/category/1083603.html
  • 回到这道题目,题解给出了一行解释:每次把一堆点加进去BFS即可
  • 没骗你们吧,这就是道BFS模板题,我们只需要将所有给出的点,扔到队列里,BFS直到empty为止,记录一下每个点到t个点的最短距离(如果没听懂就说明还是没理解BFS,滚去学BFS)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 5005;
vector<int> v[maxn];
int dis[maxn];
int n,m,p,t,s,x,y;
struct node{
    int x,len;
};
queue<node> q;
void bfs()
{
    int ans = 0;
    while(!q.empty()){
        node now = q.front();
        q.pop();
        for(int i=0;i<v[now.x].size();i++){
            if(dis[v[now.x][i]])
                continue ;
            dis[v[now.x][i]] = now.len + 1;
            q.push(node{v[now.x][i] , now.len + 1});
        }
    }
    for(int i=1;i<=n;i++)
        if((dis[i] == -1 ) || (dis[i] != 0 && dis[i] <= s))
            ans++;
    cout<<ans<<endl;
    return ;
}
int main()
{
    cin>>n>>m>>p;
    for(int i=1;i<=m;i++)
        cin>>x>>y,v[x].push_back(y),v[y].push_back(x);
    while(p--){
        cin>>t>>s;
        memset(dis,0,sizeof(dis));
        for(int i=1;i<=t;i++)
            cin>>x,q.push(node{x,0}),dis[x] = -1;
        bfs();
    }
    return 0;
}
posted @ 2020-04-07 09:43  QFNU-ACM  阅读(87)  评论(0)    收藏  举报