最短路模板集.

最短路dijkstra算法 邻接矩阵模板 复杂度 V^2

#include <iostream>
#include <cstring>
#include <algorithm>

const int INF=0x3f3f3f3f;
const int MAXN=10000;
int n,s;
int dist[MAXN];
int cost[MAXN][MAXN];
bool vis[MAXN];

void dijkstra(int s)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<MAXN;i++)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        int v=-1;
        for(int u=0;u<n;u++)
            if(!vis[u]&&(v==-1||dist[u]<dist[v])
                v=u;
        if(v==-1)
            break;
        vis[v]=true;
        for(int u=0;u<n;u++)
            dist[u]=min(dist[u],dist[v]+cost[v][u]);
            
    }
}
View Code

最短路dijkstra算法 邻接表模板  vector实现.  复杂度 VE

#include <iostream>
#include <cstring>
#include <algorithm>

const int INF=0x3f3f3f3f;
const int MAXN=10000;

struct Edge{
    int v,w;
}G[MAXN];
int n,s;
int dist[MAXN];
bool vis[MAXN];

void dijkstra(int s)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<MAXN;i++)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        int v=-1;
        for(int u=0;u<n;u++)
            if(!vis[u]&&(v==-1||dist[u]<dist[v])
                v=u;
        if(v==-1)
            break;
        vis[v]=true;
        for(int u=0;u<G[v].size();u++)
        {
            int to=G[v][u].v;
            int w=G[v][u].w;
            dist[to]=min(dist[to],dist[v]+w);
        }
    }
}
View Code

最短路dijkstra算法 邻接表模板  优先队列优化  复杂度 ElogV

void dijkstra(int ss)
{
    priority_queue<P,vector<P>,greater<P> > que;
    ll ans=0;
    for(int i=0;i<=n;i++)
        dist[i]=INF;
    dist[ss]=0;
    que.push(P(dist[ss],ss));
    while(!que.empty())
    {
        P p=que.top();que.pop();
        int u=p.second;
        if(dist[u]<p.first) continue;
        for(int i=head[u];i!=-1;i=edge[i].nex)
        {
            Edge e=edge[i];
            if(dist[e.v]>dist[u]+e.w)
            {
                dist[e.v]=dist[u]+e.w;
                que.push(P(dist[e.v],e.v));
            }
        }
    }
}
View Code

最短路bell_man算法 邻接矩阵模板   复杂度 VE

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<string>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1000;
const int MAXM=1000000;

struct Edge{
    int from,to,w;
}E[MAXM];

int dist[MAXN];
int V,E;

void bell_man(int s)
{
    for(int i=0;i<V;i++)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        bool update=false;
        for(int i=0;i<E;i++)
        {
            Edge e=E[i];
            if(dist[e.from]!=INF&&dist[e.to]>dist[e.from]+e.cost)
            {
                dist[e.to]=dist[e.from]+e.cost;
                update=true;
            }
        }
        if(!update)
            break;
    }
}
View Code

 最短路spfa算法模板  复杂度不定 约为O(kE)

const int MAXN=1010;
const int INF=0x3f3f3f3f;
struct Edge{
    int v,cost;
    Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
void addedge(int u,int v,int w)
{
    E[u].push_back(Edge(v,w));
}
bool vis[MAXN];
bool cnt[MAXN];
bool dist[MAXN];
bool SPFA(int s,int n)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++) dist[i]=INF;
    vis[s]=true;
    dist[s]=0;
    queue<int>que;
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        vis[u]=true;
        for(int i=0;i<E[u].size();i++)
        {
            int v=E[u][i].v;
            if(dist[v]>dist[u]+E[u][i].cost)
            {
                dist[v]=dist[u]+E[u][i].cost;
                if(!vis[v])
                {
                    vis[v]=true;
                    que.push(v);
                    if(++cnt[v]>n)
                        return false;
                }
            }
        }
    }
    return true;
}
View Code

 

转载于:https://www.cnblogs.com/onlyAzha/p/4743481.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值