问题描述
八中一共有 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;
}
网友评论