Dijkstra最短路径问题 - Emergency[PAT真题]

这是一道Dijkstra最短路径的变种问题。
注释里面写的比较详细了,标注上关键代码部分需要仔细思考一下,如果还是不懂,欢迎留言。

// runtime: 4ms
// space: 384K
// https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376
#include <iostream>
#include <climits>
#include <vector>
#include <queue>
using namespace std;

const int MAX = 500;

struct Edge {
    int to;
    int len;

    Edge(int t, int l ): to(t), len(l) {}
};

struct Point {
    int number;
    int distance;

    Point(int n, int d): number(n), distance(d) {}

    bool operator <(const Point& p) const {
        return distance > p.distance; // 距离小的优先级高
    }
};

int teamNum[MAX]; // 每个城市拥有的team
int dis[MAX]; // 源点到各城市最短距离
int maxTeam[MAX]; // 源点到各城市最多集结的team
int road[MAX]; // 最短路径的数量
vector<Edge> graph[MAX];

void Dijkstra(int s) {
    priority_queue<Point> q;
    dis[s] = 0;
    q.push(Point(s, dis[s]));

    while (!q.empty()) {
        int u = q.top().number;
        q.pop();

        for (unsigned int i = 0; i < graph[u].size(); ++i) { // 处理最短路径
            int to = graph[u][i].to;
            int len = graph[u][i].len;
            if (dis[to] > dis[u] + len) {
                dis[to] = dis[u] + len;
                road[to] = road[u]; // // 关键代码
                maxTeam[to] += maxTeam[u];
                q.push(Point(to, dis[to]));
            } else if (dis[to] == dis[u] + len) { // 处理最多team
                road[to] += road[u]; // 关键代码
                if (maxTeam[to] < (maxTeam[u] + teamNum[to]))
                    maxTeam[to] = maxTeam[u] + teamNum[to];
            }
        }
    }
}
int main() {
    int n, m, s, d;
    cin >> n >> m >> s >> d;

    for (int i = 0; i < n; ++i) {
        road[i] = 1; // 题目已经说明,至少有一条路
        dis[i] = INT_MAX; // 初始化为最大值
        cin >> teamNum[i];
        maxTeam[i] = teamNum[i];
    }
    for (int i = 0; i < m; ++i) {
        int from, to, len;
        cin >> from >> to >> len;
        graph[from].push_back(Edge(to, len));
        graph[to].push_back(Edge(from, len));
    }

    Dijkstra(s);

    cout << road[d] << " " << maxTeam[d] << endl;

    return 0;
}
全部评论

相关推荐

10-29 16:42
门头沟学院 Java
1.今天什么国标的公司打电话约面试,还得准备ppt,好麻烦,网上查薪资一般,打算拒了,不面了2.字节又复活了,什么安全开发,也不知道怎么样,面一面试试吧,还是挺想去字节的,但好难,随缘吧所以今天没面试
嵌入式的小白:面试前可以好好准备下 1.看看你投递的岗位的岗位描述,分析下是哪个业务线,同使要罗列他们描述中提到的技术点 2.根据1中的两点准备 3.岗位描述中应该还有语言要求,这个刷刷八股,要是对自己语言能力很有把握,那就不用看这点了 4.找下你简历中项目部分,看有没有和岗位描述中技术点重合的,这种在面试提到项目时,是高概率问题 好好准备,祝你面试顺利
我的求职进度条
点赞 评论 收藏
分享
10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务