c++题目_农场和奶牛

𝐵B 头奶牛 (1≤𝐵≤25000)(1≤B≤25000),有 𝑁(2×𝐵≤𝑁≤50000)N(2×B≤N≤50000) 个农场,编号 11 到 𝑁N,有 𝑀(𝑁−1≤𝑀≤100000)M(N−1≤M≤100000) 条双向边,第 𝑖i 条边连接农场 𝑅𝑖Ri​ 和 𝑆𝑖(1≤𝑅𝑖≤𝑁,1≤𝑆𝑖≤𝑁)Si​(1≤Ri​≤N,1≤Si​≤N),该边的长度是 𝐿𝑖(1≤𝐿𝑖≤2000)Li​(1≤Li​≤2000)。居住在农场 𝑃𝑖Pi​ 的奶牛 A (1≤𝑃𝑖≤𝑁)(1≤Pi​≤N),想送一份新年礼物给居住在农场 𝑄𝑖(1≤𝑄𝑖≤𝑁)Qi​(1≤Qi​≤N) 的奶牛 B,但是奶牛 A 必须先到大卫老师(居住在编号 11 的农场)那里取礼物,然后再送给奶牛 B。你的任务是:奶牛 A 至少需要走多远的路程?

输入格式

  • 第一行三个整数 𝑁,𝑀,𝐵N,M,B。

  • 第 22 至 𝑀+1M+1 行,每行 33 个整数 𝑅𝑖,𝑆𝑖,𝐿𝑖Ri​,Si​,Li​。

  • 第 𝑀+2M+2 至 𝑀+𝐵+1M+B+1 行,进行 𝐵B 次询问,每行 22 个整数 𝑃𝑖,𝑄𝑖Pi​,Qi​。

输出格式

每次询问输出一个整数,即答案。

输入输出样例

输入 #1复制

复制代码
6 7 3 
1 2 3 
5 4 3 
3 1 1 
6 1 9 
3 4 2 
1 4 4 
3 2 2 
2 4 
5 1 
3 6 

输出 #1复制

复制代码
6 
6 
10 

代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
struct Edge {
    int to;
    int weight;
};
class Graph {
public:
    int sum;  // 农场的数量
    vector<vector<Edge>> ve;  // 邻接表
    Graph(int n) {
        sum = n;
        ve.resize(n + 1);
    }
    void addEdge(int from, int to, int weight) {
        ve[from].push_back({to, weight});
        ve[to].push_back({from, weight});
    }
    int a(int start, int target) {
        vector<int> distance(sum + 1, INT_MAX);
        vector<bool> visited(sum + 1, false);
        distance[start] = 0;
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        pq.push({0, start});
        while (!pq.empty()) {
            int u = pq.top().second;
            pq.pop();

            if (visited[u]) {
                continue;
            }

            visited[u] = true;

            for (const auto& edge : ve[u]) {
                int v = edge.to;
                int weight = edge.weight;

                if (distance[u] + weight < distance[v]) {
                    distance[v] = distance[u] + weight;
                    pq.push({distance[v], v});
                }
            }
        }

        return distance[target];
    }
};

int main() {
    int N, M, B;
    cin >> N >> M >> B;

    Graph graph(N);

    for (int i = 0; i < M; ++i) {
        int R, S, L;
        cin >> R >> S >> L;
        graph.addEdge(R, S, L);
    }

    for (int i = 0; i < B; ++i) {
        int P, Q;
        cin >> P >> Q;
        int dn = graph.a(P, 1) + graph.a(1, Q);
        cout << dn << endl;
    }

    return 0;
}
相关推荐
纪元A梦21 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊1 天前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司1 天前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle1 天前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls1 天前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
honder试试1 天前
焊接自动化测试平台图像处理分析-模型训练推理
开发语言·python
^Rocky1 天前
JavaScript性能优化实战
开发语言·javascript·性能优化
田里的水稻1 天前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦1 天前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
ponnylv1 天前
深入剖析Spring Boot启动流程
java·开发语言·spring boot·spring