美文网首页
流感会结束吗

流感会结束吗

作者: 番薯夹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