当前位置: 代码迷 >> 综合 >> 流感会结束吗 【图论+模拟】
  详细解决方案

流感会结束吗 【图论+模拟】

热度:72   发布时间:2024-02-02 12:28:30.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 号学生痊愈,流感结束。
数据范围
n,m<=100 000。

解题思路:

使用算法:图论+模拟

算法分析:

将s[0]设为免疫期 将s[1]设为传染期 将s[2]设为痊愈期 将s[3]设为感染期

加上动态数组存图即可

Code:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
vector<int> v[N];
int s[N];
int main()
{int n,m,x,y,t,l,cnt=1,ans=-1,tmp; scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);v[x].push_back(y);v[y].push_back(x);}scanf("%d",&t);s[t]=1;while(++ans,cnt){for(int i=1;i<=n;i++){if(s[i]==1){l=v[i].size();for(int j=0;j<l;j++)if(!s[v[i][j]]) s[v[i][j]]=3;}}for(int i=1;i<=n;i++){if(s[i]==2) s[i]=0;else if(s[i]==1){s[i]=2;cnt--; }else if(s[i]==3){s[i]=1;cnt++; }}}printf("%d\n",ans);return 0;
}

 

  相关解决方案