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;
}
相关推荐
转调7 分钟前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
Java探秘者8 分钟前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
2303_8120444617 分钟前
Bean,看到P188没看了与maven
java·开发语言
秋夫人20 分钟前
idea 同一个项目不同模块如何设置不同的jdk版本
java·开发语言·intellij-idea
不穿格子衬衫35 分钟前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
萧鼎41 分钟前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python
wdxylb42 分钟前
使用C++的OpenSSL 库实现 AES 加密和解密文件
开发语言·c++·算法
aqua353574235844 分钟前
蓝桥杯-财务管理
java·c语言·数据结构·算法
CV金科1 小时前
蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)
stm32·单片机·嵌入式硬件·算法·蓝桥杯
Geek之路1 小时前
QT系统学习篇(1)
开发语言·qt·学习