现在的位置: 首页 > 综合 > 正文

最短路径问题

2014年02月08日 ⁄ 综合 ⁄ 共 1605字 ⁄ 字号 评论关闭
文章目录

题目

题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11

思路

  1. 直接用了Dijkstra算法,遍历s到其它各个顶点的最短路径,然后求出s到t的最短路径
  2. 小技巧就是用结构体存储路径长度和花费

AC代码

Dijkstra算法

#include <stdio.h>
#include <stdlib.h>
 
#define NODE 1001
#define INT_MAX 100000000
 
struct city
{
    int len, cost;
};
 
struct city map[NODE][NODE];
struct city dis[NODE];
int flag[NODE];
 
void Dijkstra(int src, int n);
 
int main()
{
    int n, m, s, t, i, j, u, v, len, cost;
 
 
    while (scanf("%d%d", &n, &m) != EOF) {
        // 终止条件
        if (n == 0 && m == 0) {
            break;
        }
         
        // 初始化图的邻接矩阵
        for (i = 0; i < n; i ++) {
            for (j = i; j < n; j ++) {
                map[i][j].len = map[j][i].len = INT_MAX;
                map[i][j].cost = map[j][i].cost = 0;
            }
        }
 
        // 接受图的边数据
        while (m --) {
            scanf("%d%d%d%d", &u, &v, &len, &cost);
            map[u - 1][v - 1].len = map[v - 1][u - 1].len = len;
            map[u - 1][v - 1].cost = map[v - 1][u - 1].cost = cost;
        }
 
        // 接收起点和终点
        scanf("%d%d", &s, &t);
 
        // Dijkstra求单源最短路径
        Dijkstra(s - 1, n);
 
        // 打印输出
        printf("%d %d\n", dis[t - 1].len, dis[t - 1].cost);
    }
 
    return 0;
}
 
void Dijkstra(int src, int n)
{
    int i, j, k, min, temp;
 
    for (i = 0; i < n; i ++) {
        dis[i].len = map[src][i].len;
        dis[i].cost = map[src][i].cost;
        flag[i] = 0;
    }
    dis[src].len = dis[src].cost = 0;
    flag[i] = 1;
 
    for (i = 1; i < n; i ++) {
        min = INT_MAX;
        k = src;
 
        for (j = 0; j < n; j ++) {
            if (flag[j] == 0 && dis[j].len < min) {
                k = j;
                min = dis[j].len;
            }
        }
 
        flag[k] = 1;
 
        for (j = 0; j < n; j ++) {
            temp = dis[k].len + map[k][j].len;
            if (temp < dis[j].len && flag[j] == 0) {
                dis[j].len = temp;
                dis[j].cost = dis[k].cost + map[k][j].cost; 
            }   
        }
    }
}
/**************************************************************
    Problem: 1008
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:40 ms
    Memory:8748 kb
****************************************************************/
【上篇】
【下篇】

抱歉!评论已关闭.