牛客网 牛客练习赛7 D. 珂朵莉的无向图(多源BFS)
题目链接 Problem D
比赛的时候完全想不到
直接对给定的这些点做多源BFS,把给定的这些点全都压到队列里,然后一个个做。
最后统计被访问的点的个数即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se second const int N = 5010; int d[N], vis[N]; int n, m, q, t, s; int ret = 0; queue < int > Q; vector < int > v[N]; void bfs(){ int x = Q.front(); Q.pop(); ++ret; if (d[x] == s) return ; for ( auto u : v[x]){ if (vis[u]) continue ; if (d[u] > d[x] + 1){ d[u] = d[x] + 1; Q.push(u); vis[u] = 1; } } } int main(){ scanf ( "%d%d%d" , &n, &m, &q); while (m--){ int x, y; scanf ( "%d%d" , &x, &y); v[x].push_back(y); v[y].push_back(x); } while (q--){ ret = 0; scanf ( "%d%d" , &t, &s); memset (d, 127, sizeof d); memset (vis, 0, sizeof vis); rep(i, 1, t){ int x; scanf ( "%d" , &x); if (vis[x]) continue ; d[x] = 0; Q.push(x); vis[x] = true ; } while (!Q.empty()) bfs(); printf ( "%d\n" , ret); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步