最短路算法

2021-04-10 23:26

阅读:630

标签:void   tar   make   循环   while   class   pop   flag   empty   

1.图的初始条件[数组表示]

//邻接表存储
int node[N];

struct Edge{
int to,next,value;
}edges[M];

int flag;

//矩阵存储
int dis[N][N];

 

已知起点和终点的最短路

dijkstra 算法:选择最短边上的点直到所有点加入。【复杂度为NlogN+M ? 】

int dis[N],vis[N];

priority_queueint> q;

//example:最短路径
int dis[N],vis[N];
priority_queueint,int>> q;

void dijsktra(int a){
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    
    dis[a]=0;
    q.push(make_pair(0,a));

    while (!q.empty()){
        int nn=q.top().second;
        q.pop();
        if (vis[nn]) continue;
        vis[nn]=1;
        for (int e=node[nn];e;e=edges[e].next){
            int ns=edges[e].to,value=dis[nn]+edges[e].value;
            if (valuedis[ns]){
                dis[ns]=value;
                q.push(make_pair(-dis[ns],ns));
            }
        }
    }
}

sfpa算法【适用于负权值边,最大复杂度为NM】【基于Bellman-Ford算法】

【bfs+队列】【出队遍历子点,子点满足条件则加入队列,循环直到队列为空,达到极值】

int dis[N],vis[N];
queueint> q;

void sfpa(int start){
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    
    //init
    dis[start]=0;
    vis[start]=1;
    q.push(start);
    
    while(!q.empty()){
        int cn=q.front();
        q.pop();
        vis[cn]=0;
        for(int e=node[cn];e;e=edges[e].next){
            int sn=edges[e].to,value=edges[e].value;
            if(dis[sn]>dis[cn]+value){
                dis[sn]=dis[cn]+value;
                if(!vis[sn])q.push(sn),vis[sn]=1;
            }
        }
    }
}

Floyd算法【用dis[N][N]存储最短距离,依次寻找路径点数为k的最短路径,遍历n次,即为最短距离】【是否有环路】

void floyd(int n){
    for(int k=1;k)//k指的是路径中包含前k个点
       for(int i=1;i)
           for(int j=1;j)
               dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}

 

最短路算法

标签:void   tar   make   循环   while   class   pop   flag   empty   

原文地址:https://www.cnblogs.com/nianyi/p/13363975.html


评论


亲,登录后才可以留言!