最短路大全

来源:互联网 发布:殷嘉恩 let it go 编辑:程序博客网 时间:2024/06/09 12:52

前言

最短路是算法中比较常用的,它的思想也贯穿着整个竞赛的。
这里蒟蒻我就总结一下。

Floyd

code

    struct Floyd{//O(n^3)        int dis[M][M];        void solve(){            //这里dis在读入前初始为INF,一边读一边存边             REP(k,1,n)                REP(i,1,n)                    REP(j,1,n)                        dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);           }    }Floyd;

Bellman

code

    struct Bellman{//O(n*m)         struct edge{            int from,to,cost;        }es[M<<1];        int dis[M];        void solve(int s){            mcl(dis,63);            dis[s]=0;            while(1){                bool f=1;                REP(i,1,m){//存边                     if(dis[es[i].from]!=INF && dis[es[i].to]>dis[es[i].from]+es[i].cost){                        dis[es[i].to]=dis[es[i].from]+es[i].cost;                        f=0;                    }                   }                if(f)break;            }        }    }Bellman;

Dijkstra

code

    struct Dijkstra{//O(n log m) 单点         bool vis[M];         int dis[M];        struct node{            int to,cost;            bool operator<(const node &_)const{                return cost>_.cost;            }        };        vector<node>E[M];        priority_queue<node>Q;        void solve(int s){            mcl(dis,63);            mcl(vis,0);            dis[s]=0;            Q.push((node){s,0});            while(!Q.empty()){                node now=Q.top();Q.pop();                int x=now.to;                if(vis[x])continue;                vis[x]=1;                REP(i,0,E[x].size()-1){                    node y=E[x][i];                    if(dis[y.to]>now.cost+y.cost){                        dis[y.to]=now.cost+y.cost;                        Q.push((node){y.to,dis[y.to]});                    }                }            }        }    }Dijkstra;

SPFA

code

    struct SPFA{        struct node{            int to,cost;        };        vector<node>E[M];        queue<int>Q;        int dis[M];        bool vis[M];        void solve(int s){            mcl(dis,INF);            mcl(vis,0);            Q.push(s);            dis[s]=0;            vis[s]=1;            while(!Q.empty()){                int x=Q.front();Q.pop();                REP(i,0,E[x].size()-1){                    node y=E[x][i];                    if(dis[y.to]>dis[x]+y.cost){                        dis[y.to]=dis[x]+y.cost;                        if(!vis[y.to]){                            vis[y.to]=1;                            Q.push(y.to);                         }                    }                }             }        }    }SPFA;

小结:最短路在树上的题目是可以做为暴力分的,而且还是比较从简的。

原创粉丝点击