最短路模板集.

最短路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]);

    }
}

最短路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);
        }
    }
}

最短路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));
            }
        }
    }
}

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

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

时间: 2024-10-21 20:45:30

最短路模板集.的相关文章

HDU 5521.Meeting 最短路模板题

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3361    Accepted Submission(s): 1073 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

POJ 2449Remmarguts&#39; Date K短路模板 A*+SPFA

太水了我不想说了,模板在这里 14312K 313MS 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int v[100010],v2[100010],c[100010],c2[100010],s,t,k,duin; 7 int n,m,point[1010],next[100010],cnt=0,

poj1511/zoj2008 Invitation Cards(最短路模板题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds      Memory Limit: 65536 KB In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fa

poj 2449 Remmarguts&#39; Date (k短路模板)

Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30772   Accepted: 8397 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly tou

uva 11374 最短路+记录路径 dijkstra最短路模板

UVA - 11374 Airport Express Time Limit:1000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu [Submit]  [Go Back]  [Status] Description ProblemD: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to t

POJ 2449 Remmarguts&#39; Date(k短路模板)

link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 #include <iostream> #include <cstring> #include <queue> using namespace std; const int MAXN=1010; struct node { int p,g,h; bool operator < (node a) const {

[poj2449]Remmarguts&#39; Date(K短路模板题,A*算法)

解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e3+10; const

模板集(。

维蒂斯保佑. 全排列: #include<iostream> #include<string.h> using namespace std; int n,a[11]; bool b[11]; int s(int k); int p(); int s(int k) { int i; for(i=1;i<=n;++i) { if(b[i]) { a[k]=i; b[i]=false; if(k==n) p(); else s(k+1); b[i]=true; } } } int

hdu1874 最短路模板题

之所以做了第二道模板题还要写是因为发现了一些自己的问题 用的是dij 最简单的松弛 需要注意的地方是松弛的时候 判断dis[i]<dis[w]+tance[w][i]时 还要再判断 vis[i] 要保证这个点没有成为过最小点 即这个点不会是已经被松弛过的点 输入的时候要注意 可能会有重边的输入 每次输入的时候进行一次判断 如果输入的是较大值 就不用更换了 关于memset的使用 它只能用来设置0与-1 别的值会出现莫名的错误 #include<stdio.h> #include<s