最短路 Dijkstra模板

普通dijkstra,复杂度O(n*n)

#include<bits/stdc++.h>
using namespace std;
int n,m,f[105][105],dis[105];   
bool b[105];    //n为总共的点数,m为路径数,f数组记录两个点的距离,dis数组记录每个点到原点的距离 
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int aa,bb,cc;
        scanf("%d%d%d",&aa,&bb,&cc);
        f[bb][aa]=f[aa][bb]=cc;
    }
    memset(dis,1,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=n;i++)
        if(f[1][i]) dis[i]=f[1][i];     //将刚开始与1点连接的点路径记录 
    for(int i=1;i<=n;i++){
        int k=0;
        int mn=2<<29;       //一个大数 
        for(int j=1;j<=n;j++){
            if(!b[j] && dis[i]+f[i][j]<mn && f[i][j]){
                mn=dis[i]+f[i][j];          //记录最短点和路径 
                k=j;
            }
        }
        if(k==0)    break;
        b[k]=1;
        dis[k]=mn;
        for(int j=1;j<=n;j++)
            if(dis[k]+f[k][j]<dis[j] && f[k][j])    //更新其余点 
                dis[j]=dis[k]+f[k][j];
    }
    printf("%d",dis[n]);
}

堆优化,复杂度O(mlog(n))。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>

using namespace std;
const int MAXN = 10005,MAXM = 500005;

struct Edge{
    int nxt,to,v;
}edge[MAXM];

int n,m,st,cnt,head[MAXN],dis[MAXN];
bool vis[MAXN];

struct cmp{
    bool operator()(int x,int y){
        return dis[x]>dis[y];
    }
};

inline void add(int bg,int ed,int w){
    edge[++cnt].to=ed;
    edge[cnt].v=w;
    edge[cnt].nxt=head[bg];
    head[bg]=cnt;
}

inline void dijkstra(){
    priority_queue<int,vector<int>,cmp> q;
    memset(dis,0x3f,sizeof(dis));
    q.push(st);
    dis[st]=0;
    while(!q.empty()){
        int x=q.top();
        q.pop();
        if(vis[x])  continue;
        vis[x]=1;
        for(register int i=head[x];i;i=edge[i].nxt){
            int u=edge[i].to;
            dis[u]=min(dis[u],dis[x]+edge[i].v);
            q.push(u);
        }
    }
}

int main(){
    scanf("%d%d%d",&n,&m,&st);
    for(register int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }
    dijkstra();
    for(register int i=1;i<=n;i++)
        printf("%d ",dis[i]);
    return 0;
}
posted @ 2017-12-19 23:23  Monster_Qi  阅读(107)  评论(0编辑  收藏  举报