码迷,mamicode.com
首页 > 其他好文 > 详细

最短路模板集.

时间:2015-08-19 23:15:41      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

最短路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

技术分享
const int INF=0x3f3f3f3f;
const int MAXN=1000;
const int MAXM=1000000;
typedef pair<int,int> P;
struct Edge{
    int to,cost;
}G[MAXM];

int dist[MAXN];
int V,E;

void dijkstra(int s)
{
    priority_queue<P,vector<P>,greater<P> > que;
    fill(dist,dist+V,INF);
    dist[s]=0;
    while(!que.empty())
    {
        P p=que.top();que.pop();
        int v=p.second;
        if(dist[v]<p.first) continue;
        for(int i=0;i<G[v].size();i++)
        {
            Edge e=G[v][i];
            if(dist[e.to]>dist[v]+e.cost)
            {
                dist[e.to]=dist[v]+e.cost;
                que.push(P(dist[e.to],e.to));
            }
        }
    }
}
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

 

最短路模板集.

标签:

原文地址:http://www.cnblogs.com/onlyAzha/p/4743481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!