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;
}
相关推荐
Uitwaaien544 分钟前
51 单片机矩阵键盘密码锁:原理、实现与应用
c++·单片机·嵌入式硬件·51单片机·课程设计
网络风云20 分钟前
golang中的包管理-下--详解
开发语言·后端·golang
墨楠。31 分钟前
数据结构学习记录-树和二叉树
数据结构·学习·算法
小唐C++37 分钟前
C++小病毒-1.0勒索
开发语言·c++·vscode·python·算法·c#·编辑器
S-X-S43 分钟前
集成Sleuth实现链路追踪
java·开发语言·链路追踪
醇醛酸醚酮酯1 小时前
Leetcode热题——移动零
算法·leetcode·职场和发展
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
Aqua Cheng.1 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法
夏末秋也凉1 小时前
力扣-数组-704 二分查找
算法·leetcode
玛丽亚后1 小时前
动态规划(路径问题)
算法·动态规划