算法模板(三)最短路问题

Dijkstra

#include
#define maxn 1000
#define maxm 1000
#define X first
#define Y second
using namespace std;
typedef pair pall;
struct edge{
    int u,v,w,next;
}E[maxm<<1];
int p[maxn],eid=0;
struct cmp{
    operator ()(const pall &a,const pall &b)const{
        if(a.Y!=b.Y)return a.Y s;
    s.insert(make_pair(u,0));
    for(register int i=0;iX;
        s.erase(*s.begin());
        vis[u]=1;
        for(register int j=p[u];~j;j=E[j].next){
            int v=E[j].v;
            int w=E[j].w;
            if(!vis[v] && dis[v]>dis[u]+w){
                s.erase(make_pair(v,dis[v]));
                s.insert(make_pair(v,dis[v]=dis[u]+w));
            }
        } 
    }
}
int u,v,w;
int main(){
    init();
    cin>>n>>m;
    for(register int i=0;i>u>>v>>w;
        insert2(u,v,w);
    }
    dijkstra(1);
    cout<

SPFA

#include
#define maxn 2000
#define maxm 4000
using namespace std;
struct edge{
    int u,v,w,next;
}E[maxm<<1];
int p[maxn],eid;
void init(){
    for(register int i=0;i q;
    q.push(u);
    while(!q.empty()){
        u=q.front();
        q.pop();
        vis[u]=0;
        for(register int i=p[u];~i;i=E[i].next){
            int v=E[i].v;
            int w=E[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            } 
        }
    }
}
int u,v,w;
int main(){
    init();
    cin>>n>>m;
    for(register int i=0;i>u>>v>>w;
        insert2(u,v,w);
    }
    spfa(1);
    cout<

Floyd

#include
using namespace std;
int mp[300][300];
int n,m;
int u,v,w;
void floyd(){
    for(register int k=1;k<=n;k++){
        for(register int i=i+1;i<=n;i++){
            for(register int j=1;j<=n;j++)mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
        }
    }
}
int main(){
    cin>>n>>m;
    for(register int i=0;i>u>>v>>w;
        mp[u][v]=w;
        mp[v][u]=w;
    }
    floyd();
    cout<

你可能感兴趣的:(算法模板(三)最短路问题)