7-9 旅游规划 (25 分)(Dijkstra算法)

题意: 

《7-9 旅游规划 (25 分)(Dijkstra算法)》

 思路:单源最短路问题,Dijkstra算法搞定就可以了,因为要找出最便宜的最短路,所以需要在更新最短距离的时候加一个条件(即当最短距离相等的时候,如果该路径的花费更小,就更新最小花费)就可以了。之前自己学的最短路的水平也就仅限于模板题的水平,现在可以在条件上稍微加一些变化,做了数据结构的作业,顺便加深了自己对最短路(Dijkstra)算法的理解。

题目所给样例的示意图(数据放在了代码的后边):

《7-9 旅游规划 (25 分)(Dijkstra算法)》

代码: 

#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
#define FRE() freopen("in.txt","r",stdin)

using namespace std;
typedef long long ll;
typedef pair<int,int> P;//first是距离,second是点的编号
const int maxn = 1000;
struct Edge{
    int to,c,d;
    Edge(int t,int cost,int dis):to(t),c(cost),d(dis){}
};
vector<Edge> G[maxn];
priority_queue<P, vector<P>, greater<P> > que;
int dist[maxn],cost[maxn];
int n,m,st,en;


void init(){
    int s,e,d,c;
    scanf("%d%d%d%d",&n,&m,&st,&en);
    for(int i = 0; i<m; i++){
        scanf("%d%d%d%d",&s,&e,&d,&c);
        G[s].push_back(Edge(e,c,d));
        G[e].push_back(Edge(s,c,d));
    }
    for(int i = 0; i<n; i++){
        dist[i] = INF;
        cost[i] = INF;
    }
}

int main(){
    //FRE();
    init();
    dist[st] = 0;
    cost[st] = 0;
    que.push(P(0,st));//指的是当前点的最短距离
    while(que.size()){
        P p = que.top();
        que.pop();
        int v = p.second;//当前的点
        if(p.first > dist[v])continue;
        //cout<<"v: "<<v;
        for(int i = 0; i<G[v].size(); i++){
            Edge e = G[v][i];//当最短距离相等的时候而花费更小的时候,更新最短距离的花费
            if((dist[e.to] > dist[v]+e.d)||(dist[e.to] == dist[v]+e.d && cost[e.to] > cost[v]+e.c)){
                dist[e.to] = dist[v]+e.d;
                cost[e.to] = cost[v]+e.c;
                //cout<<" cost: "<<cost[e.to];
                que.push(P(dist[e.to], e.to));
            }
            //cout<<" "<<dist[e.to];
        }
        //cout<<endl;
    }
    printf("%d %d\n",dist[en],cost[en]);
    return 0;
}
/*
样例输入:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
样例输出:
3 40
*/

 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/sykai1/article/details/82824316
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞