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

题目描述

      信奥班中一共有 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
#define N 100005
using namespace std;
vector 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

 

你可能感兴趣的:(流感会结束吗 【图论+模拟】)