美文网首页
流感会结束吗

流感会结束吗

作者: 番薯夹islandfsj | 来源:发表于2018-09-17 23:21 被阅读0次

    问题描述

    八中一共有 n 个学生。这 n 个学生里一共有 m 对朋友关系。
    在流感发作期,每个健康学生都要看望当天他生病的朋友(如果有的话) ,并在第二天
    被传染上疾病(除非他在免疫期内) ;
    每个生病的学生在第二天都会痊愈,并在这一天具有免疫性。从第三天起,看望生病的
    朋友将再次使他染上流感。
    初始时(第一天) ,只有一个学生患有流感。试问多少天后流感会自动结束。

    输入文件

    第一行输入两个正整数 n 和 m。
    接下来 m 行每行两个正整数 x,y,表示编号为 x 的学生和编号为 y 的学生是一对朋友。
    输入数据保证每一对朋友关系只描述一次。
    最后一行输入一个正整数,代表初始时患有流感的学生的编号。

    输出文件

    如果流感永远不会结束,请输出-1,否则输出多少天后流感会结束。
    答案保证不超过 2 000 000 000。

    样例输入

    4 4
    1 2
    2 3
    3 4
    2 4
    1

    样例输出

    3

    样例说明

    第一天 1 号学生生病,2号学生访问他;
    第二天 2 号学生生病,其它三个学生访问他,由于 1 号处于免疫期,未患流感;
    第三天 3、4 号学生生病,2号学生访问他们。
    第四天 3、4 号学生痊愈,流感结束。

    时间限制

    各测试点 1 秒

    内存限制

    你的程序将被分配 32MB 的运行空间

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<cstring>
    
    using namespace std;
    
    queue<int> team,day;
    vector<int> map[100040];
    int k[100040],kk[100040],kkk[100040];
    int maxl,s,e,n,m,start;
    
    int main(){
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            cin>>s>>e;
            map[s].push_back(e);
            map[e].push_back(s);
        }
        maxl=0;
        cin>>start;
        memset(k,0,sizeof(k));
        memset(kk,0,sizeof(kk));
        memset(kkk,0,sizeof(kkk));
        kk[start]=1;team.push(start);day.push(1);
        while(not team.empty()&&day.front()<=2000000000){
            int p=team.front();
            int pp=day.front();
            for(int i=0;i<map[p].size();i++){
                if(k[map[p][i]]==0&&kk[map[p][i]]==0){
                    team.push(map[p][i]);
                    day.push(pp+1);
                    if(pp+1>maxl) maxl=pp+1;
                    kkk[map[p][i]]=1;
                }
            }
            team.pop();
            day.pop();
            if(not day.empty()&&pp!=day.front()){
                for(int i=1;i<=n;i++)
                  k[i]=kk[i];
                for(int i=1;i<=n;i++)
                  kk[i]=kkk[i];
                memset(kkk,0,sizeof(kkk));
            }
        }
        if(team.empty())
          cout<<maxl<<endl;
          else
            cout<<-1<<endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:流感会结束吗

          本文链接:https://www.haomeiwen.com/subject/jewdnftx.html