#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

struct Edge {
    int v, next;
};

const int MAXN = 105;
const int MAXM = 1005;

int n, p, c;
int m;
int head[MAXN], cnt;
Edge edges[MAXM * 2];
int dist[MAXN];
bool vis[MAXN];

void addEdge(int u, int v) {
    edges[cnt].v = v;
    edges[cnt].next = head[u];
    head[u] = cnt++;
}

void bfs(int u) {
    queue<int> q;
    q.push(u);
    dist[u] = 0;
    vis[u] = true;
    while (!q.empty()) {
        int cur = q.front();
        q.pop();
        for (int i = head[cur]; i != -1; i = edges[i].next) {
            int v = edges[i].v;
            if (!vis[v]) {
                dist[v] = dist[cur] + 1;
                vis[v] = true;
                q.push(v);
            }
        }
    }
}

int main() {
    cin >> n >> p >> c;
    cin >> m;
    for (int i = 1; i <= n; i++) {
        head[i] = -1;
        dist[i] = -1;
        vis[i] = false;
    }
    cnt = 0;
    for (int i = 0; i < p; i++) {
        int u, v;
        cin >> u >> v;
        addEdge(u, v);
        addEdge(v, u);
    }
    bfs(c);
    int maxDist = 0;
    for (int i = 1; i <= n; i++) {
        maxDist = max(maxDist, dist[i]);
    }
    int ans = m * maxDist;
    cout << ans << endl;
    return 0;
}

解题思路:

首先使用邻接表构建图的数据结构,然后使用BFS算法计算出每个小朋友与C小朋友之间的最短距离。最后,将最短距离与吃糖的时间m相乘,即可得到所有小朋友都吃完糖的时间

题目描述:童年的我们将和朋友分享美好的事物作为自己的快乐。这天C小朋友得到了Plenty of candies将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间同一个小朋友不会重复接受糖果。由于糖果足够多如果某时刻某小朋友接受了糖果他会将糖果分成若干份分给那些在他身旁且还没有得到糖果的小朋友们而且自己会吃一些糖果。由于嘴馋小朋友们等不及将糖果发完会在得到糖果后边吃边发。每

原文地址: https://www.cveoy.top/t/topic/hFBL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录