Dijkstra算法的C++实现

#include <iostream>
#include <vector>
#include <queue>
#define MAX_VALUE 1000

using namespace std;

int **a;
int num_ver;
int *pre;

void init();//初始化全局变量
void readData();//读取数据
void ShortPath(int v);//寻找最短路径
void printPath(int pre[],int v,int u);//输出最短路径
int findMin(int dis[],bool s[]);//寻找下一个最短的路径

void init()
{
    cout << "Please input the number of vertexs:";
    cin >> num_ver;
    a = new int*[num_ver];
    for(int i = 0; i < num_ver; i++)
    {
        a[i] = new int[num_ver];
    }
    pre = new int[num_ver];
}

void readData()
{
    cout << "Please input the adjacency matrix:" << endl;
    for(int i = 0; i < num_ver; i++)
    {
        for(int j = 0; j < num_ver; j++)
        {
            cin >> a[i][j];
        }
    }
}

void ShortPath(int v)
{
    int dis[num_ver];
    bool s[num_ver];
    int u;

    for(int i = 0; i < num_ver; i++)
    {
        if(i != v)
        {
            s[i]=0;
            dis[i] = a[v][i];
            if(dis[i] == MAX_VALUE)
            {
                pre[i] = -1;
            }
            else
            {
                pre[i] = v;
            }
        }
    }

    s[v] = 1;//选中V节点
    dis[v] = 0;
    for(int i = 1; i < num_ver; i++)
    {
        u = findMin(dis,s);//找下一个最短的路径
        s[u] = 1;
        for(int j = 1; j < num_ver; j++)//更新链接矩阵
        {
            if(s[j] == 0&&dis[u] + a[u][j] < dis[j])
            {
                dis[j] = dis[u]+a[u][j];
                pre[j] =u;
            }

        }
    }
}

int findMin(int dis[],bool s[])
{
    int min;
    int i,k;
    for(i = 0; s[i] == 1&&i < num_ver; i++);
    min = dis[i];
    k = i;
    for(i = i + 1; i < num_ver; i++)
    {
        if(s[i] == 0&&dis[i] < min)
        {
            k = i;
            min = dis[i];
        }
    }
    return k;
}

void printPath(int pre[],int v,int u)
{
    queue<int> que;
    int tmp = u;
    while(tmp!=v)
    {
        que.push(pre[tmp]);
        tmp = pre[tmp];
    }
    while(!que.empty())
    {
        cout<<que.front()<<'\t';
        que.pop();
    }
}

int main()
{
    init();
    readData();
    ShortPath(0);
    printPath(pre,0,num_ver - 1);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值