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;
}
相关推荐
淼澄研学2 小时前
Kimi API黑产倒卖技术解析与Python合规接入指南
开发语言·网络·python
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_03 小时前
C++正则表达式
开发语言·c++·正则表达式
何以解忧,唯有..3 小时前
Python 元组(tuple)详解:使用、遍历与排序
开发语言·python
KANGBboy3 小时前
Python eval安全隐患
开发语言·python
IT爱学堂3 小时前
java版数据结构和算法+AI算法和技能学习指南
java·开发语言
民乐团扒谱机3 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
淼澄研学4 小时前
Python结合大模型挖掘搜题长尾关键词实操指南
开发语言·python
Nil2084 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
FfHUCisI4 小时前
Golang - 信号量模式(Semaphore Pattern)
开发语言·后端·golang