问答

求助,关于最短路径问题

作者:admin 2021-04-17 我要评论

求助,自己按无权图的最短路径的代码,写了个带权图的最短路径。我写的Dijkstra的不同,我是用类似于BFS实现的。但在网上找不到和我相似的代码,所以想问一下我...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

求助,自己按无权图的最短路径的代码,写了个带权图的最短路径。我写的Dijkstra的不同,我是用类似于BFS实现的。但在网上找不到和我相似的代码,所以想问一下我写的代码正确吗?已经用过多组数据测试过了,没有发现问题。

#include <cstdio>
#include <iostream>
#include <queue>

const int INF = 0x3f3f3f3f;

struct Edge {
    int v1, v2;
    int weight;
};

struct AdjVNode {
    int adjVer;
    int weight;
    AdjVNode *next;
};

struct VNode {
    AdjVNode *firstEdge;
};

struct LGraph {
    int verNum;
    int edgeNum;
    VNode *G;
};

LGraph *createLGraph();
void insert(LGraph *Graph, Edge *edge);
int *shortestPath(LGraph *Graph, int src);

int main() {
    LGraph *Graph = createLGraph();
    int *path = shortestPath(Graph, 0);
    
    return 0;
}

LGraph *createLGraph() {
    int n, m;
    scanf("%d %d", &n, &m);
    
    LGraph *Graph = new LGraph;
    Graph->verNum = n;
    Graph->edgeNum = m;
    
    Graph->G = new VNode[n];
    for (int v = 0; v < n; v++) {
        Graph->G[v].firstEdge = NULL;
    }
    
    for (int i = 0; i < m; i++) {
        Edge *edge = new Edge;
        scanf("%d %d %d", &edge->v1, &edge->v2, &edge->weight);
        insert(Graph, edge);
        delete edge;
    }
    
    return Graph;
}

void insert(LGraph *Graph, Edge *edge) {
    AdjVNode *adjV = new AdjVNode;
    adjV->adjVer = edge->v2 - 1;
    adjV->weight = edge->weight;
    
    adjV->next = Graph->G[edge->v1 - 1].firstEdge;
    Graph->G[edge->v1 - 1].firstEdge = adjV;
}

int *shortestPath(LGraph *Graph, int src) {
    int dist[Graph->verNum], *path = new int[Graph->verNum];
    std::fill(dist, dist + Graph->verNum, INF);
    std::fill(path, path + Graph->verNum, -1);
    dist[src] = 0;
    
    std::queue<int> q;
    q.push(src);
    
    while(!q.empty()) {
        int v = q.front();
        q.pop();
        
        AdjVNode *w = Graph->G[v].firstEdge;
        while (w) {
            if (dist[v] + w->weight < dist[w->adjVer]) {
                dist[w->adjVer] = dist[v] + w->weight;
                path[w->adjVer] = v;
                q.push(w->adjVer);
            }
            
            w = w->next;
        }
    }
    
    for (int v = 0; v < Graph->verNum; v++) {
        printf("%-3d", dist[v]);
    }
    putchar('\n');
    for (int v = 0; v < Graph->verNum; v++) {
        printf("%-3d", path[v] + 1);
    }

    return path;
}

我是用邻接表实现的。麻烦给位大神看一下。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器