STLダイクストラの達成(最近非常に便利と感じました

STLは、踏み台として使用することができます

--- Rujia劉

struct Edge{
    int x,y,val;
    Edge(int x = 0, int y = 0, int val = 0) : x(x), y(y), val(val) {}
};//弧 
//以下为vector版 
    
    int n,m,M,s;//M为总边数
    vector<Edge> edges;// 边列表
    vector<int> G[MAXN];// 每个节点出发的边的编号(从0开始
    bool vis[MAXN];
    int d[MAXN];//s 到各点距离 
    int p[MAXN];// 最短路上的一条边
    
    void init(int n) {
        for(int i = 0; i < n; i++) G[i].clear() ;
        edges.clear() ; 
    }
    
    void add_edge(int x, int y, int val) {
        edges.push_back(Edge(x,y,val));//没有构造函数的写法
        m = edges.size() ; 
        G[x].push_back(m-1);
    }

    void dijkstra (int s) {
        priority_queue <node> q;
        for(int i = 0; i < n; i++) d[i] = INF; 
        d[s] = 0;
        memset(vis, 0, sizeof(vis));
        q.push(node(s,0));
        while(!q.empty() ) {
            node tmp = q.top() ; q.pop() ;
            int u = tmp.id ;
            if(vis[u]) continue;
            vis[u] = true;
            for(int i = 0;i < G[u].size() ; i++) {
                Edge& e = edges[ G[u][i] ];//引用不加也行 
                if(d[e.y] > d[u] + e.val ) {
                    d[e.y ] = d[u] + e.val ;
                    p[e.y ] = G[u][i];
                    q.push(node(e.y , d[e.y ])) ;
                }
            }
        } 
    }
    

おすすめ

転載: www.cnblogs.com/virtualtan/p/10965735.html