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;
    }
    
    • 0
      @ 2025-9-4 21:59:40

      输出从 ss 开始的 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
      上传者