2 条题解
-
0
用队列 记录当前被感染的人, 来记录是否免疫, 记录是否在队列中。
为空即没有感染的人,直接输出 。
然后用快读快写避免 TLE 就可以过了。
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+10; vector<int>g[MAXN]; int n,m,s,day=2; bool inq[MAXN],mian[MAXN]; struct sk { int u,ver; }; queue<sk>q; int read() { int x=0,f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } return x*f; } void out(int x) { if(x<0)x=-x; if(x<10)putchar(x+'0'); else out(x/10),putchar(x%10+'0'); } int main() { n=read(),m=read(),s=read(); for(int i=1;i<=m;i++) { int u=read(),v=read(); g[u].push_back(v); g[v].push_back(u); } q.push({s,1}); inq[s]=1; while(day<=MAXN) { while(!q.empty()&&q.front().ver==day-1) { int u=q.front().u; q.pop(); inq[u]=0; for(auto v:g[u]) { if(!inq[v]&&!mian[v]) { inq[v]=1; q.push({v,day}); } } mian[u]=day; } if(q.empty()) { out(day-1); return 0; } day++; } puts("-1"); return 0; } -
0
输出从 开始的 BFS 轮数即可。
#include <bits/stdc++.h> using namespace std; struct F { int to[200012], ns[200012], fs[100012]; int m = 0; void add(int f, int t) { m++; to[m] = t; ns[m] = fs[f]; fs[f] = m; } }; F f; bool ok[100012]; int r = 0; queue<int> q; int main() { int n, m, s; cin >> n >> m >> s; while (m--) { int x, y; cin >> x >> y; f.add(x, y); f.add(y, x); } q.push(s); ok[s] = true; while (!q.empty()) { r++; int h = q.size(); while (h--) { int u = q.front(); q.pop(); int ii = f.fs[u]; while (ii) { if (!ok[f.to[ii]]) { ok[f.to[ii]] = true; q.push(f.to[ii]); } ii = f.ns[ii]; } } } cout << r << endl; return 0; }
- 1
信息
- ID
- 43
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 21
- 已通过
- 3
- 上传者