Dijkstra模板

来源:互联网 发布:三国之数据辅助 编辑:程序博客网 时间:2024/06/08 10:43
void Dijkstra(int st){    memset(conf,0,sizeof(conf));    conf[st]=1;//标记除起点外所有点的最短路都未确定    for(int i=1;i<=mc;i++)        dis[i]=a[i][st];    dis[st]=0;//起点到起点为0    for(int i=1;i<=mc;i++){        int tempmin=INF;        int aim=st;        for(int j=0;j<=mc;j++)// 找出当前未确定的点j的dis[j]最小值        if(!conf[j]&&dis[j]<tempmin){            aim=j;//aim为当前邻接点中距离最小的点            tempmin=dis[j];        }        conf[aim]=1;        for(int j=1;j<=mc;j++){//松弛操作,通过新加入的点的路径找到离st点更短的路径             if(!conf[j]&&a[aim][j]!=INF&&dis[aim]+a[aim][j]<dis[j])                dis[j]=dis[aim]+a[aim][j];        }    }    return ;}

堆优化

void dijkstra(int st){    for(int i=0;i<MAXN;i++){        dis[i]=INF;        vis[i]=0;    }    dis[st]=0;    priority_queue <int> a;    int e;    a.push(0);    int v;    while(!a.empty()){        e=a.top();        a.pop();        vis[e]=0;        for(int i=0;i<edge[e].size();i++){            v=edge[e][i].v;            if(dis[v]==INF||dis[v]>dis[e]+edge[e][i].w){                dis[v]=dis[e]+edge[e][i].w;                if(!vis[v]){                    vis[v]=1;                    a.push(v);                }            }        }    }}



0 0
原创粉丝点击