做题时遇到的一个题,发个博客记录一下笔记
题目描述:
童年的我们,将和朋友分享美好的食物作为自己的快乐。这天,C 小朋友得到了很多糖果,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要 1 秒的时间,同一个小朋友不会重复接受糖果。
由于糖果足够多,如果某时刻某小朋友接受了糖果,他会将糖果分成若干份,同时分给那些在他身旁且还没有得到糖果的小朋友们,而且自己会吃一些糖果。由于嘴馋,小朋友们等不及将糖果发完,会在得到糖果后边吃边发。每个小朋友从接受糖果到吃完糖果需要 m 秒的时间。那么,如果第 1 秒 C 小朋友开始发糖,第多少秒所有小朋友都吃完了糖呢?
核心思想:BFS,队列
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define M 100010
int vis[M];
int n, p, c;
int m;
typedef struct Anode{
int adjvex;
struct Anode* next;
}ANode;
typedef struct Vnode {
ANode* firstarc;
}VNode;
typedef struct Adj {
VNode adjlist[M];
}ADJ;
typedef struct qu {
int x;
int level;
}Qu;
int main()
{
scanf("%d %d %d", &n, &p, &c);
scanf("%d", &m);
ADJ* g=(ADJ*)malloc(sizeof(ADJ));
//建立邻接表
for (int i = 1; i <= n; i++) g->adjlist[i].firstarc = NULL;
for (int i = 1; i <=p; i++) {
int x, y;
scanf("%d %d", &x, &y);
ANode* p = (ANode*)malloc(sizeof(ANode));
p->adjvex = y;
p->next = g->adjlist[x].firstarc;
g->adjlist[x].firstarc = p;
ANode* q = (ANode*)malloc(sizeof(ANode));
q->adjvex = x;
q->next = g->adjlist[y].firstarc;
g->adjlist[y].firstarc = q;
}
Qu qu[M];
int front, rear;
front = rear = -1;
rear++;
qu[rear].x = c;
qu[rear].level =0;
while (front < rear) {
front++;
Qu now = qu[front];
vis[now.x] = 1;
ANode* p = g->adjlist[now.x].firstarc;
while (p != NULL) {
int w = p->adjvex;
if (vis[w] == 0) {
rear++;
qu[rear].x = w;
qu[rear].level = now.level + 1;
}
p = p->next;
}
}
printf("%d", qu[rear].level + m);
return 0;
}