spfaの簡単なコード

#include<queue>
#include<vector>
#define M 105
#define INF 0x3f3f3f3f
int dis[M];//储存最短路径
int vis[M];//标记该点是否在队列当中
int path[M];
int inque[M];//统计次数
int n,m;//n个点,m条边
struct edge{
    
    
    int to;//当前点的下一顶点
    int cost;//两点之间的权值
};
vector<edge> maps[M];
bool spfa(int s){
    
    
    for(int i=0;i<=n;i++){
    
    
        dis[i]=INF;
    }
    queue<int> q;
    dis[s]=0;//初始数组
    q.push(s);//顶点
    inque[s]=1;
    while(!q.empty()){
    
    
        int u=q.front();//取首
        q.pop();
        vis[u]=0;
        for(int i=0;i<maps[u].size();i++){
    
    
            int to=maps[u][i].to;//下一个顶点
            if(dis[u]+maps[u][i].cost<dis[to]){
    
    
                dis[to]=dis[u]+maps[u][i];
                if(!vis[to]){
    
    
                    vis[to]=1;
                    inque[to]++;
                    q.push(to);
                    if(inque[to]>n){
    
    
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

おすすめ

転載: blog.csdn.net/iuk11/article/details/108493361