求一个无向图的某一点到所有点的最短路经

  1. 单纯的给出某个点到所有点的最小权值,可以利用各种算法,但是给出某一个点到所有节点的全职最短路径的算法比较少。经过长时间的思考。终于初有成效。
    我们要处理的图片如下:
    在这里插入图片描述
    我们求出1到各个节点的最短路径。
    我们可以定义一个mappath(map<int,vector>)的map。存储1-2,1-3,1-4,1-5的最短路径等。这样我们在1,2,4中找最短路径的时候,比如我们找到4-5=2是最小的,那么我们可以返回mappath[4],这样5的最短路径就是mappath[4].push_back(5)。就是1-5的最短路径。
    1-2-4-5再找最短路径,找到3(3是4给出来的)最小,3的最短路径就是mappath[4].push_back(3)即可。这样mappath存储的就是1到各个节点的最短路径的走法。
    直接上代码:
    #include
    #include
    #include
    #include
    #include
    using namespace std;
    #define max_num 7
    struct Node
    {
    Node(int val,Node *next,int weight )
    {
    this->val = val;
    this->next = next;
    this->weight = weight;
    }
    int val;
    Node *next;
    int weight;
    }*gGraph[1001];
    int visited[1001];
    bool isInEdge(int x, int y)
    {
    auto head = gGraph[x];
    while (head)
    {
    if (head->val == y)
    {
    return true;
    }
    head = head->next;
    }
    return false;
    }
    void addEdge(int x, int y, int weight)
    {
    if (!isInEdge(x, y))
    {
    gGraph[x] = new Node(y, gGraph[x], weight);
    }
    if (!isInEdge(y, x))
    {
    gGraph[y] = new Node(x, gGraph[y], weight);
    }
    }
    map<int, vector> mapPath;
    vector vectorVisted;
    void calShortPath(int i)
    {
    visited[i] = 1;
    vectorVisted.push_back(i);
    int vexter = -1;
    int minValue = INT_MAX;
    int vexterfront = -1;

    for (int i = 0; i < vectorVisted.size(); i++)
    {
    int num = vectorVisted[i];
    for (Node *nd = gGraph[num]; nd != nullptr; nd = nd->next)
    {
    if (nd->weight < minValue && visited[nd->val] == 0)
    {
    minValue = nd->weight;
    vexter = nd->val;
    vexterfront = num;
    }
    }
    }
    if (vexterfront == -1)
    {
    return;
    }
    if (mapPath.find(vexterfront) != mapPath.end())
    {
    auto x = mapPath[vexterfront];
    x.push_back(vexter);
    mapPath[vexter] = x;
    }
    calShortPath(vexter);
    }
    void display()
    {
    for (int i = 0; i <= max_num; i++)
    {
    auto head = gGraph[i];
    if (head)
    {
    while (head)
    {
    cout << i << " <–> " << head->val<<" "<weight<<endl;
    head = head->next;
    }
    cout << “--------” << endl;
    }
    }
    }
    int main()
    {
    memset(visited, 0, sizeof(visited));
    addEdge(1, 2, 4);
    addEdge(1,4,6);
    addEdge(2,4,1);
    addEdge(2,5,4);
    addEdge(3,4,3);
    addEdge(3,5,7);
    addEdge(4,5,2);
    addEdge(4,6,5);
    addEdge(5,7,4);
    addEdge(6,7,6);
    mapPath[1] = vector{ 1 };
    calShortPath(1);
    for (auto x : mapPath)
    {

    auto vectori = x.second;
    cout << "1 start and to "<<x.first<<":" << endl;
    for (auto i : vectori)
    {
    	cout << i << " ";
    }
    cout << endl;
    

    }
    //display();
    system(“pause”);
    return 0;
    }
    执行结果如下图所示:
    在这里插入图片描述
    当然本算法也有缺点,如果存在孤立点或者子图的情况下不好处理。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值