dijkstra最短路

打 Div.3 发现两个最短路板子题一个用的 SPFA 一个用的邻接矩阵,赶紧补个。


#include <iostream>
#include <queue>
#define MAXN 20010
using namespace std;
const int inf = 2147483647;
int n,m,s,t,cnt;
int dis[MAXN],h[MAXN],to[MAXN],val[MAXN],nxt[MAXN];
bool vis[MAXN];
struct node {
    int v,w;
    friend bool operator < (node a,node b) {
        return a.w > b.w;
    }
} tmp;
priority_queue <node> q;
void add(int a,int b,int c) {
    to[++cnt] = b;
    val[cnt] = c;
    nxt[cnt] = h[a];
    h[a] = cnt;
}
void dijkstra() {
    for(int i = 1;i <= n;++ i) dis[i] = inf;
    dis[s] = 0;
    tmp.v = s;tmp.w = 0;q.push(tmp);
    while(!q.empty()) {
        int u = q.top().v;
        q.pop();
        if(vis[u]) continue;
        vis[u] = 1;
        for(int i = h[u];i;i = nxt[i]) {
            if(dis[to[i]] > (long long)dis[u] + val[i]) {
                dis[to[i]] = dis[u] + val[i];
                tmp.w = dis[to[i]];
                tmp.v = to[i];
                q.push(tmp);
            }
        }
    }
    for(int i = 1;i <= n;++i)
    cout <<dis[i] << ' ';
}
int main() {
    cin >> n >> m >> s;
    int u,v,w;
    for(int i = 1;i <= m;++ i) {
        cin >> u >> v >> w;
        add(u,v,w);
    }
    dijkstra();
    return 0;
}

时间复杂度O(nlogn)

作者:eegg

出处:https://www.cnblogs.com/eegg/p/17609492.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   eegg  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示