【原创】最短路模板 Floyd,优先队列优化dijkstra,SPFA

版权声明:未经过作者允许,QωQ是可以转载的,只不过要赞一下本文章并发评论告诉我,然后转载附上原网址就好了!=QωQ= https://blog.csdn.net/c20182030/article/details/78340833

天天高高兴兴打打模板

#include<cmath>  
#include<queue>
#include<cstdio> 
#include<vector>
#include<cstring>  
#include<algorithm>  
using namespace std;  

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

int N,M;

int Mix[MAXN][MAXN];//邻接矩阵存图

struct edge//临界表存图
{
    int to,val;
    bool operator < (const edge & p) const
    {
        return val<p.val;
    }
}h;
vector <edge> G[MAXN];
int cnt,head[MAXN];
void addedge(int u,int v,int w)
{
    h.to=v,h.val=w;
    G[u].push_back(h);
}
//多源点最短路:Floyd
int dis[MAXN][MAXN];
void Floyd()
{
    //dis初值:如果i==j,dis=0,如果i,j有连边,dis=边权,否则dis=INF
    for(int k=1;k<=N;k++)
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}

//单源点最短路:Spfa,dijkstra
int Dis[MAXN];

bool inq[MAXN];
int showup[MAXN];
int Spfa(int s,int t)
{
    queue<int>Q;
    for(int i=1;i<=N;i++) Dis[i]=(i==s)?0:INF;
    Q.push(s),inq[s]=1,showup[s]++;

    int v,p,m,sz;

    while(!Q.empty())
    {
        p=Q.front(),Q.pop(),inq[p]=0,
        sz=G[p].size();

        for(int i=0;i<sz;i++)
        {
            v=G[p][i].val,m=G[p][i].to;

            if(Dis[m]>v+Dis[t])
            {
                Dis[m]=v+Dis[t];
                if(!inq[m])
                {
                    Q.push(m),inq[m]=1,showup[m]++;
                    if(showup[m]>N) return -1;
                }
            }
        }

    }
    if(Dis[t]==INF) return -2;
    return Dis[t];
}

void dijkstra(int s,int t)
{
    priority_queue<edge>Q;
    for(int i=1;i<=N;i++) Dis[i]=(i==s)?0:INF;
    h.to=s,h.val=0;
    Q.push(h);

    while(!Q.empty())
    {
        edge x=Q.top();Q.pop();
        int sz=G[x.to].size();
        for(int i=0;i<sz;i++)
        {
            edge y=G[x.to][i];
            if(Dis[y.to]>x.val+y.val)
            {
                Dis[y.to]=x.val+y.val;
                h.to=y.to,h.val=Dis[y.to];
                Q.push(h);
            }
        }
    }

}

int main()
{

}
阅读更多
换一批

没有更多推荐了,返回首页