HDU1874 - 畅通工程续

此题是经典的Dijkstra单源最短路径问题。

// runtime: 33ms
#include <iostream>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

const int MAX = 200;

struct Edge {
    int to; // 终点
    int length;
    Edge(int t, int l) : to(t), length(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 dis[MAX]; // 源点到各点的距离
vector<Edge> graph[MAX]; // 邻接表实现的图

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

    while (!q.empty()) {
        int n = q.top().number; // 离源点最近的点
        q.pop();

        for (int i = 0; i < graph[n].size(); ++i) {
            int to = graph[n][i].to;
            int len = graph[n][i].length;

            if (dis[to] > dis[n] + len) {
                dis[to] = dis[n] + len;
                q.push(Point(to, dis[to]));
            }
        }
    }
}

int main() {

    int n, m;
    while (cin >> n >> m) {

        memset(graph, 0, sizeof(graph));
        fill(dis, dis + n, INT_MAX); // 初始化为不可达

        while (m--) {
            int from, to, d;
            cin >> from >> to >> d;
            graph[from].push_back(Edge(to, d));
            graph[to].push_back(Edge(from, d));
        }
        int s, t;
        cin >> s >> t;

        Dijkstra(s);

        if (dis[t] == INT_MAX)
            cout << -1 << endl;
        else
            cout << dis[t] << endl;
    }
    return 0;
}
全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务