前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++迪杰斯特拉最短路径算法实现

C++迪杰斯特拉最短路径算法实现

作者头像
kalifa_lau
发布2018-04-26 14:55:16
1.3K0
发布2018-04-26 14:55:16
举报
文章被收录于专栏:kalifaの日々kalifaの日々
input

第一行表示这个图有4条边,下面五行代表这个图的5条边。

4
0 2 2
0 1 5
1 3 2
2 3 6
-1 0 0

输入样例

out

分别输出结点“0”到结点0,1,2,3的最短距离。

0 5 2 7
源码
#include <queue>
#include <vector>
#include <cstdio>
using namespace std;
#define MAX 10000
#define INF 10000

class edge{
public:

    int to,cost;
    edge(int to,int cost)
    {
        this->to=to;
        this->cost=cost;
    }

};

vector<edge> G[MAX];
int d[MAX];
int v;

typedef pair<int,int> P;

void build()
{
    printf("input v\n");
    scanf("%d",&v);
    while(true)
    {
        int from,to,cost;
        scanf("%d %d %d",&from,&to,&cost);
        if(from<0)
        {
            break;
        }
        G[from].push_back(edge(to,cost));
        G[to].push_back(edge(from,cost));

    }
}

void dijkstra(int s)
{
    priority_queue< P,vector<P>,greater<P> > que;
    fill(d,d+v,INF);
    d[s]=0;
    que.push(P(0,s));

    while(!que.empty())
    {
        P p=que.top();
        que.pop();
        int v = p.second;
        if(d[v]<p.first) continue;
        for(int i=0;i<G[v].size();i++)
        {
            edge e = G[v][i];
            if(d[e.to]>d[v]+e.cost)
            {
                d[e.to]=d[v]+e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
}

vector<int> get_path(int des)
{
    vector<int> res;
    res.push_back(des);
    //printf("lalalala\n");
    while(des!=0)
    {

        vector<edge> edges = G[des];
        //printf("size of edges: %d\n",edges.size());
        for(int i=0;i<edges.size();i++)
        {
            //printf("%d %d\n",edges[i].to,edges[i].cost);
            if(d[des]==d[edges[i].to]+edges[i].cost)
            {
                //printf("前驱结点是:%d",i);
                res.push_back(edges[i].to);
                des = edges[i].to;
                break;
            }
        }
    }
    return res;
}

int main()
{
    build();
    dijkstra(0);
    for(int i=0;i<v;i++)
    {
        printf("%d ",d[i]);
    }
    vector<int> res = get_path(3);
    printf("从终点3到起点1的最短路径是:\n");
    for(int i=0;i<res.size();i++)
    {
        printf("%d ",res[i]);
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • input
  • out
  • 源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档