2 条题解

  • 0
    @ 2025-9-6 15:57:08

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

    qq 为空即没有感染的人,直接输出 day−1day-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;
    }
    

    信息

    ID
    43
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    21
    已通过
    3
    上传者