浙大数据结构——07-图6 旅游规划 (25分)——单源带权值最短路径问题(含条件判断)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

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算法

使用结构体数组来储存图的信息,先根据输入将图建立起,再使用Dijkstra算法来算最短路,但同时要加一个条件判断即当路径长度相同时要采用花费少的

if(!visited[i] && G[v][i].dis != Inf && dist[v] + G[v][i].dis == dist[i] && cost[v] + G[v][i].cost < cost[i])
{
      cost[i] = cost[v] + G[v][i].cost;
}

完整代码

#include 
#define Inf 0x7FFFFFFF
using namespace std;
const int Max_Size = 510;

struct Node
{
    int dis,cost;
}G[Max_Size][Max_Size];
bool visited[Max_Size];
int dist[Max_Size],cost[Max_Size];
int N,M,s,d;

void BuildGraph();
void Dijkstra();
int FindMindist();

int main()
{
    cin >> N >> M >> s >> d;
    BuildGraph();
    Dijkstra();
    cout << dist[d] << " " << cost[d] << endl;
    return 0;
}
void BuildGraph()
{
    for(int i = 0 ; i < N; i++)
    {
        for(int j = 0 ; j < N; j++)
        {
            G[i][j].dis = Inf;
            G[i][j].cost = Inf;
        }
        dist[i] = Inf;
        cost[i] = Inf;
        G[i][i].cost = 0;/*自己到自己的花费和路长都为0*/
        G[i][i].dis = 0;
    }
    for(int i = 0 ; i < M; i++)
    {
        int u,v,d,c;
        cin >> u >>v >> d >> c;
        G[u][v].cost = c;
        G[u][v].dis = d;
        G[v][u].cost = c;
        G[v][u].dis = d;
    }
}
int FindMindist()
{
    int Mindist = Inf,Minv;
    for(int i = 0 ; i < N ; i++)
    {
        if(!visited[i] && dist[i] < Mindist)
        {
            Mindist = dist[i];
            Minv = i;
        }
    }
    if(Mindist != Inf)
    {
        return Minv;
    }
    else
    {
        return -1;
    }
}
void Dijkstra()
{
    for(int i = 0 ; i < N; i++)
    {
        dist[i] = G[s][i].dis;
        cost[i] = G[s][i].cost;
    }
    dist[s] = 0;
    cost[s] = 0;
    visited[s] = true;
    while(1)
    {
        int v = FindMindist();
        if(v == -1)
        {
            break;
        }
        visited[v] = true;
        for(int i = 0 ; i < N; i++)
        {
            if(!visited[i] && G[v][i].dis != Inf && dist[v] + G[v][i].dis < dist[i])
            {
                dist[i] = dist[v] + G[v][i].dis;
                cost[i] = cost[v] + G[v][i].cost;
            }
            if(!visited[i] && G[v][i].dis != Inf && dist[v] + G[v][i].dis == dist[i] && cost[v] + G[v][i].cost < cost[i])
            {
                cost[i] = cost[v] + G[v][i].cost;
            }
        }
    }
}

你可能感兴趣的:(数据结构:图论)