- P43's solution
P43's Solution
- 2025-9-6 15:57:08 @
用队列 记录当前被感染的人, 来记录是否免疫, 记录是否在队列中。
为空即没有感染的人,直接输出 。
然后用快读快写避免 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;
}