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

来源:互联网 发布:ubuntu命令行进入桌面 编辑:程序博客网 时间:2024/05/19 03:42

天天高高兴兴打打模板

#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);}//多源点最短路:Floydint 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,dijkstraint 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(){}