最短路模板集.

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

#include 
#include 
#include 

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)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        int v=-1;
        for(int u=0;u)
            if(!vis[u]&&(v==-1||dist[u]<dist[v])
                v=u;
        if(v==-1)
            break;
        vis[v]=true;
        for(int u=0;u)
            dist[u]=min(dist[u],dist[v]+cost[v][u]);
            
    }
}
View Code

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

#include 
#include 
#include 

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)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        int v=-1;
        for(int u=0;u)
            if(!vis[u]&&(v==-1||dist[u]<dist[v])
                v=u;
        if(v==-1)
            break;
        vis[v]=true;
        for(int u=0;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,greater

> 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]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
#include
#include
#include
#include
#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)
        dist[i]=INF;
    dist[s]=0;
    while(1)
    {
        bool update=false;
        for(int i=0;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){}
};
vectorE[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)
        {
            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

你可能感兴趣的:(最短路模板集.)