首页 > 其他分享 >【模版】最短路

【模版】最短路

时间:2024-07-01 16:32:15浏览次数:1  
标签:cnt const int 模版 短路 memset Eg dis

原创于2017.04.03:最短路

1.多源的Floyd, 邻接矩阵实现,复杂度O(n^3),n<400;
2.单源Dijkstra,邻接矩阵实现,无负边,复杂度O(n^2),n<10000;
3.单源Dijkstra,邻接表实现,堆优化,无负边,复杂度O(E logE),点多边少;
4.单源bellman_ford,边集实现,可验负环,复杂度O(nE),nm<10^8;
5.单源SPFA,邻接表+队列实现,可验负环,复杂度 < O(nE);
6.单源SPFA,邻接表+栈实现,可验负环,复杂度 < O(n
E);
专题练习:斌神的【最短路】

点击查看代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;


/********Floyd********/
int const N=10000;
int const INF=99999999;
int w[N][N];

void init(int n)
{
    memset(w,0,sizeof(w));
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        if(i==j)continue;
        w[i][j]=INF;
    }
}
void floyd(int n)
{
    for(int u=1;u<=n;u++)
    for(int v=1;v<=n;v++)
    {
        if(u==v)continue;
        for(int i=1;i<=n;i++)
        {
            if(i==u||i==v)continue;
            if(w[u][v]>w[u][i]+w[i][v])
                w[u][v]=w[u][i]+w[i][v];
        }
    }
}
/************************/


/********Dijkstra********/
int const N=10000;
int const INF=99999999;
int w[N][N];
int dis[N],fa[N],b[N];

void dijkstra(int n,int s)
{
    memset(b,0,sizeof(b));
    memset(fa,-1,sizeof(fa));
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[s]=0;
    for(int j=0;j<n;j++)
    {
        int k=-1,mmin=INF;
        for(int i=1;i<=n;i++)
            if(!b[i]&&dis[i]<mmin)k=i,mmin=dis[i];
        if(k==-1)break;
        b[k]=1;
        for(int i=1;i<=n;i++)
        {
            if(!b[i]&&dis[i]>dis[k]+w[k][i])
            {
                dis[i]=dis[k]+w[k][i];
                fa[i]=k;
            }
        }
    }
}
/*************************/


/*******Dijkstra_堆*******/
int const N=10000;
int const INF=99999999;
int dis[N],b[N],fa[N];
struct Node
{
    int x;
    int feet;
    Node(int _x=0,int _feet=0):x(_x),feet(_feet){}
    bool operator <(const Node &a)const
    {
        return feet>a.feet;
    }
}an;
priority_queue<Node> q;
struct Eg
{
    int v;
    int w;
    Eg(int _v=0,int _w=0):v(_v),w(_w){}
};
vector<Eg> E[N];

void addge(int u,int v,int w)
{
    E[u].push_back(Eg(v,w));
}
void dijkstra(int n,int s)
{
    memset(b,0,sizeof(b));
    memset(fa,-1,sizeof(fa));
    while(!q.empty())q.pop();
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[s]=0;
    q.push(Node(s,0));
    while(!q.empty())
    {
        an=q.top();q.pop();
        if(b[an.x])continue;
        b[an.x]=1;
        int u=an.x;
        for(int i=0;i<E[u].size();i++)
        {
            int v=E[u][i].v;
            int w=E[u][i].w;
            if(!b[v]&&dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;fa[v]=u;
                q.push(Node(v,dis[v]));
            }
        }
    }
}
/*************************/


/******bellman_ford*******/
int const N=10000;
int const INF=99999999;
int dis[N];
struct Eg
{
    int u;
    int v;
    int w;
    Eg(int _u=0,int _v=0,int _w=0):u(_u),v(_v),w(_w){}
};
vector<Eg> E;

int bellman(int n,int s)
{
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[s]=0;
    for(int j=0;j<n-1;j++)
    {
        int flag=1;
        for(int i=0;i<E.size();i++)
        {
            int u=E[i].u,v=E[i].v,w=E[i].w;
            if(dis[E[i].v]>dis[E[i].u]+E[i].w)
            {
                dis[E[i].v]=dis[E[i].u]+E[i].w;
                flag=0;
            }
        }
        if(flag) return 1;
    }
    for(int i=0;i<E.size();i++)
        if(dis[E[i].v]>dis[E[i].u]+E[i].w)return 0;
    return 1;
}
/***************************/


/*********SPFA_队列*********/
int const N=10000;
int const INF=99999999;
int dis[N],b[N],cnt[N];
struct Eg
{
    int v;
    int w;
    Eg(int _v=0,int _w=0):v(_v),w(_w){}
};
vector<Eg> E[N];
queue<int> q;

void addge(int u,int v,int w)
{
    E[u].push_back(Eg(v,w));
}
int spfa(int n,int s)
{
    memset(b,0,sizeof(b));
    memset(cnt,0,sizeof(cnt));
    while(!q.empty())q.pop();
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[s]=0;
    q.push(s);b[s]=1;cnt[s]++;
    while(!q.empty())
    {
        int u=q.front();q.pop();
        b[u]=0;
        for(int i=0;i<E[u].size();i++)
        {
            int v=E[u][i].v;
            if(dis[v]>dis[u]+E[u][i].w)
            {
                dis[v]=dis[u]+E[u][i].w;
                if(!b[v])
                {
                    q.push(v);b[v]=1;cnt[v]++;
                    if(cnt[v]>n) return 0;
                }
            }
        }
    }
    return 1;
}
/***************************/


/*********SPFA_栈*********/
int const N=10000;
int const INF=99999999;
int dis[N],b[N],cnt[N];
struct Eg
{
    int v;
    int w;
    Eg(int _v=0,int _w=0):v(_v),w(_w){}
};
vector<Eg> E[N];
stack<int> s;

void addge(int u,int v,int w)
{
    E[u].push_back(Eg(v,w));
}
int spfa(int n,int s)
{
    memset(b,0,sizeof(b));
    memset(cnt,0,sizeof(cnt));
    while(!s.empty())s.pop();
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[s]=0;
    s.push(s);b[s]=1;cnt[s]++;
    while(!s.empty())
    {
        int u=s.top();s.pop();
        b[u]=0;
        for(int i=0;i<E[u].size();i++)
        {
            int v=E[u][i].v;
            if(dis[v]>dis[u]+E[u][i].w)
            {
                dis[v]=dis[u]+E[u][i].w;
                if(!b[v])
                {
                    s.push(v);b[v]=1;cnt[v]++;
                    if(cnt[v]>n) return 0;
                }
            }
        }
    }
    return 1;
}
/***************************/

标签:cnt,const,int,模版,短路,memset,Eg,dis
From: https://www.cnblogs.com/YIBook/p/18278340

相关文章

  • Codeforces Round 918 G. Bicycles (二维最短路)
    G.Bicycles题意:在一个无向图里你要从1点到达n点,每条路的路径长度是该路的权值乘于你当前的慢度因子。而在每个点上我们都有一个慢度因子可以进行更换,问你到达n点所需要的最短时间。思路:我们很容易想到每次遇到更小的慢度因子我们就要更换,但因为存在你先去绕远路拿更小的慢......
  • 最短路径问题
    最短路径问题最短路问题是图论中一种重要的算法,本章将包括:目录最短路径问题一.概念1.概念2.解决方案二.\(Flord\)算法1.算法思想2.代码详解3.算法应用及局限性二.\(Djikstra\)算法1.算法思想2.代码详解3.算法特征及其局限性三.\(Bellman-ford\)算法1.算法思路2.代码详解3.......
  • 记某模版菠菜管理后台登录思路
    1.前言由于小程序的便捷性,越来越多的应用迁移到了了小程序上,由此伴随着小程序上线前的日常渗透测试工作也开始增加。但小程序的测试中经常会遇到数据包被加密了,导致无法进行改包测试。和测试网页数据包加密一样,就需要找到小程序前端相应的加解密方法进行加解密数据包改包测......
  • 电力系统潮流计算及不对称短路分析(Matlab代码实现)
    ......
  • 电力系统潮流计算及不对称短路分析(Matlab代码实现)
    ......
  • matlab有向网络节点之间最短路经计算
      clc;clear;%定义边列表(源节点,目标节点,权重)w1=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];s1=[1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,4,5,6,7,7,8,9,10,10,10,11,11,11,12,13,14,14,15,15,15,16,17,18,......
  • FlowUs高级块技巧:模版按钮的使用方法,本质上是个快捷方式和斜杠唤起类似
    什么是FlowUs模版按钮?点击模版按钮,会在页面内出现你预先编辑好的内容,这些内容可以是一些代办列表,甚至也可以是一个/多个子页面。价值和场景FlowUs息流的模版按钮的用处在于在用户减少重复性的输入,提高输入效率同时,多人协作场景,也可以通过模版按钮......
  • 【Vue3的组合式API】超详细教程,含computed、watch、组件通信、模版引用......
    前言:哈喽,大家好,我是前端菜鸟的自我修养!今天给大家分享【Vue3的组合式API】超详细教程,包含setup语法糖、computed、watch、组件通信、模版引用、vue3新特性等等......,并提供具体代码帮助大家深入理解,彻底掌握!原创不易,如果能帮助到带大家,欢迎收藏+关注哦......
  • 基于数据挖掘的虚假评论识别方法研究(论文模版参考)
    第一章绪论1.1研究背景和意义随着互联网和社交媒体的快速发展,人们越来越倾向于在网络上表达自己的观点和评价。虚假评论作为网络评论的一种,对消费者、商家以及整个市场都带来了很大的影响。虚假评论不仅误导了消费者的购买决策,损害了商家的信誉,还可能导致市场竞争的扭曲......
  • 求单源最短路径的新方法
    参见:dijkstra算法为什么高效。本来不想谈算法,本来只想了一下dijkstra算法背后的形而上,但还是归纳出一个仅靠一次广度优先遍历就能获得单源最短路径的新算法,框图里是算法流程,流程下是一个例子:它不单单可在广度优先遍历时间复杂度求解最短路径,还能在支付额外的insert......