题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int n,p,c,m;
vector<int>a[MAX];
bool vis[MAX];
struct People
{
int num2,get2,eat2;
People() {}
People(int a,int b,int c):num2(a),get2(b),eat2(c){}
}people;
int dfs(int num,int get,int eat)
{
queue<People> q;
people = People(num,get,eat);
q.push(people);
while(!q.empty()){
people = q.front();
q.pop();
int x = people.num2;
for(int i = 0;i < a[x].size();i++){
if(!vis[a[x][i]]){
vis[a[x][i]] = true;
q.push(People(a[x][i],people.get2 + 1,people.get2 + 1 + m));
}
}
}
return people.eat2;
}
int main()
{
int x,y;
cin >> n >> p >> c >> m;
for(int i = 0;i < p;i++){
cin >> x >> y;
a[x].push_back(y);
a[y].push_back(x);
}
vis[c] = true;
cout << dfs(c,1,m + 1) << endl;
return 0;
}
一开始想用二维数组来保存小朋友之间的关系,但这里n要到100000,用二位数组作为全局变量肯定要爆,所以我想到了使用vector来记录小朋友之间的关系,这可以节约很多空间。vis[i]来代表糖是否已经传到编号为i的小朋友手中,随后就可以使用bfs来解决这个问题了,每次往队列放一个结构体,结构体有小朋友的编号,小朋友拿到糖的时间,以及小朋友吃了糖的时间,最后输出队列中最后一个小朋友的吃了糖的时间就可以了,因为当最后一个小朋友吃完糖之后所有小朋友的糖也就全部吃完了。