用队列 qq 记录当前被感染的人,mianmian 来记录是否免疫,inqinq 记录是否在队列中。

qq 为空即没有感染的人,直接输出 day1day-1

然后用快读快写避免 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;
}