首页 > 其他分享 >最短路

最短路

时间:2023-01-29 21:36:17浏览次数:40  
标签:return struct int 短路 bool ow dis

单源最短路

spfa

int dis[N],vis[N],cnt[N],nw;
struct edge{int v,w;};
vector<edge> e[N];
queue<int> sp;
il bool spfa(int st,int n){
    for(ri int i=1;i<=n;++i) dis[i]=inf;
    dis[st]=0,sp.push(st),vis[st]=1;
    while(!sp.empty()){
        nw=sp.front(),sp.pop(),vis[nw]=0;
        for(ri unsigned int i=0;i<e[nw].size();++i){
            if(dis[nw]+e[nw][i].w<dis[e[nw][i].v]){
                dis[e[nw][i].v]=dis[nw]+e[nw][i].w;
                cnt[e[nw][i].v]=cnt[nw]+1;
                if(cnt[e[nw][i].v]>=n) return 0;
                if(!vis[e[nw][i].v]){
                    vis[e[nw][i].v]=1;
                    sp.push(e[nw][i].v);
                } 
            }
        }
    }
    return 1;
}

dijkstra

int dis[N],vis[N];
struct edge{int v,w;};
vector<edge> e[N];
struct qwq{
    int u,we;
    bool operator < (const qwq &o) const{
        return we>o.we;
    }
}ow,oo;
priority_queue<qwq> dij;
il void dijkstra(int st,int n){
    for(ri int i=1;i<=n;i++) dis[i]=inf;  
    dis[st]=0;
    ow=(qwq){st,dis[st]};
    dij.push(ow);
    while(!dij.empty()){
        ow=dij.top();
        dij.pop();
        if(vis[ow.u]) continue;
        vis[ow.u]=1;
        for(ri unsigned int i=0;i<e[ow.u].size();++i){
            if(dis[e[ow.u][i].v]>dis[ow.u]+e[ow.u][i].w){
                dis[e[ow.u][i].v]=dis[ow.u]+e[ow.u][i].w;
                oo=(qwq){e[ow.u][i].v,dis[e[ow.u][i].v]};
                dij.push(oo);
            }
        }
    }
    return;
}

全源最短路

Johnson

边权可能为负,且图中可能存在重边和自环


namespace edge{
    struct ovo{int v,w;};
    vector<ovo> e[N];    
}

namespace Spfa{
    using namespace edge;
    queue<int> s;
    int dis[N],cnt[N];
    bool vs[N];
    il bool spfa(int st,int n){
        for(ri int i=1;i<=n;++i) dis[i]=inf;
        ri int u;s.push(st),dis[st]=0,vs[st]=1;
        while(!s.empty()){
            u=s.front(),s.pop(),vs[u]=0;
            for(ovo o:e[u]){
                if(dis[u]+o.w<dis[o.v]){
                    dis[o.v]=dis[u]+o.w;
                    cnt[o.v]=cnt[u]+1;
                    if(cnt[o.v]>n) return 1;
                    if(!vs[o.v]){
                        s.push(o.v),vs[o.v]=1;
                    }
                }
            }
        }
        return 0;
    }
}

namespace dijkstra{
    using namespace edge;
    int dis[N];  bool vs[N];
    struct qwq{
        int u,dis;
        bool operator<(cs qwq o)cs{
            return dis>o.dis;
        }
    };
    priority_queue<qwq> d;
    il void dij(int st,int n){
        for(ri int i=1;i<=n;++i) dis[i]=inf,vs[i]=0;
        dis[st]=0;ri int u;
        d.push({st,dis[st]});
        while(!d.empty()){
            u=d.top().u,d.pop();
            if(vs[u]) continue;
            vs[u]=1;
            for(ovo o:e[u]){
                int w=o.w+Spfa::dis[u]-Spfa::dis[o.v]; // 重新设置边权
                if(w+dis[u]<dis[o.v]){
                    dis[o.v]=w+dis[u];
                    d.push({o.v,dis[o.v]});
                }               
            }
        }
        return;
    }
}


il void Johnson(int n){
    for(ri int i=1;i<=n;++i){
        edge::e[0].push_back({i,0});
    } // 新建一个虚拟节点,从这个点向其他所有点连一条边权为 0 的边。
    if(Spfa::spfa(0,n)) return puts("-1"),0;
    //预处理跑一遍 Bellman-Ford ( spfa 是 Bellman-Ford 的一种优化 )
    for(ri int i=1,as;i<=n;++i){
        dijkstra::dij(i,n),as=0;
        for(ri int j=1;j<=n;++j){
            if(dijkstra::dis[j]==inf) as+=j*(1e9);
            else as+=j*(dijkstra::dis[j]+Spfa::dis[j]-Spfa::dis[i]);
        }
        wt(as),putchar('\n');
    }
}

资料->

标签:return,struct,int,短路,bool,ow,dis
From: https://www.cnblogs.com/windymoon/p/17073859.html

相关文章

  • 【综合笔试题】难度 4.5/5,经典次短路问题
    题目描述这是LeetCode上的​​2045.到达目的地的第二短时间​​,难度为困难。Tag:「最短路」、「BFS」、「堆优化Dijkstra」、「AStar算法」、「启发式搜索」城市......
  • 【面试高频题】难度 3.5/5,综合最短路的 DP 问题
    题目描述这是LeetCode上的​​1976.到达目的地的方案数​​,难度为中等。Tag:「最短路」、「拓扑排序」、「动态规划」你在一个城市里,城市由 个路口组成,路口编号为......
  • 【图论】最短路模板
    SPFA:inlinevoidspfa(intx){memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));dis[x]=0;vis[x]=true;Q.push(x);while(!Q.empty()){intu......
  • POJ--3255 Roadblocks(最短路)
    记录0:252023-1-27http://poj.org/problem?id=3255reference:《挑战程序设计竞赛(第2版)》2.4.4p108DescriptionBessiehasmovedtoasmallfarmandsometimese......
  • 图的应用(校园导航图最短路径求解)
    ​一、实验要求:设计四川轻化工大学的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些......
  • 【最短路】Atcoder Beginner Contest 286----E
    题目:E-Souvenir(atcoder.jp)题解:首先这道题可以很容易看出来是求最短路。最开始自己是用bfs写的,出现了WA,TLE,RE等错误。因为对于每种情况会有Q次询问,如果每次询问都......
  • P4366 [Code+#4]最短路
    首先,可以证明,不存在一种最短路算法的时间复杂度与边数无关其次,我们发现,这里的代价是与异或有关的,异或可以被认为是将不同的二进制位变为相同,所以我们可以发现,两个点直接......
  • 最短路
    最短路算法最短路算法分为两大类:1.单源最短路,常用算法有:(1)dijkstra,只有所有边的权值为正时才可以使用。在稠密图上的时间复杂度是O(n2),稀疏图上的时间复杂度是O(mlogn......
  • C语言最短路径[迪杰斯特拉算法][2023-01-16]
    C语言最短路径[迪杰斯特拉算法][2023-01-16]算法与数据结构课程设计要求一、 题目:最短路径二、课程设计报告要求1、设计目的(1)要求熟练掌握C语言的基本知识和编程技......
  • 【BFS】LeetCode 1091. 二进制矩阵中的最短路径
    题目链接1091.二进制矩阵中的最短路径思路BFS找最短路模板题代码classSolution{publicintshortestPathBinaryMatrix(int[][]grid){if(grid[0][......