洛谷P3110 [USACO14DEC]Piggy Back S 题解 BFS

题目链接:https://www.luogu.com.cn/problem/P3110

解题思路:
\(1,2,n\) 三个点分别求一下最短路(因为是无权图所以可以直接用BFS实现最短路)。

示例代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 40040;
int B, E, P, n, m, disB[maxn], disE[maxn], disP[maxn], ans = INT_MAX;
vector<int> g[maxn];
queue<int> que;
void handle(int s, int dis[]) {
    while (!que.empty()) que.pop();
    memset(dis, -1, sizeof(int)*(n+1));
    dis[s] = 0;
    que.push(s);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        int sz = g[u].size();
        for (int i = 0; i < sz; i ++) {
            int v = g[u][i];
            if (dis[v] == -1) {
                dis[v] = dis[u] + 1;
                que.push(v);
            }
        }
    }
}
int main() {
    cin >> B >> E >> P >> n >> m;
    while (m --) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    handle(1, disB);
    handle(2, disE);
    handle(n, disP);
    for (int i = 1; i <= n; i ++) {
        ans = min(ans, disB[i] * B + disE[i] * E + disP[i] * P);
    }
    cout << ans << endl;
    return 0;
}
posted @ 2020-09-18 15:13  quanjun  阅读(99)  评论(0编辑  收藏  举报