Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2460507
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类:

2009-12-23 21:06:09

百度地图
Submit: 76   Accepted:27
Time Limit: 2000MS  Memory Limit: 65536K
Description
newstar 想去饭店大吃一顿,用baidu地图查找周围饭店分布情况,baidu地图给他列了一个饭店的列表,加学校一共有N个地点,其标号为1到N,学校在第1号 地点上。从百度地图上可以知道这些地点之间是否有路。由于北京的交通十分糟糕,因此同一条路来回走用的时间可能是不一样的(也就是说给的道路的耗费时间是 有向的)。从学校走到每个饭店并返回学校都有一个最短时间,并保证用最短时间的策略走,newstar只去一个饭店,现在想知道去哪个饭店所花时间最小, 并且最小值是多少?

Input
多组数据
第1行: 三个整数N(1 ≤ N ≤ 1000), M (1 ≤ M ≤ 100,000);
第2到M+1行:每行有三个整数A,B,T (1 ≤ T≤ 100),表示从A号地点走到B号地点需要用T的时间。(记住时间是有向的)
饭店号码从1,2,3,...,N;


Output
每组数据输出一行,只有两个整数,中间隔着一个空格。输出饭店号码和最优往返用时最短耗费时间。


Sample Input

4 8
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3


Sample Output

3 4

解题思路:
可以用单源最短路径来做。
计算出1-N的所有单源最短路径,然后根据所有单源最短路径信息计算出1-n(n属于1-N)-1的路径中的最小值

可以用dijkstra来求单源最短路径,使用数组来实现,extract_min可以用c++的最小优先级队列来实现,这里为了代码实现的简单,就采用了数组的方式。(其实我不是很熟悉c++的pqueue,改天把她搞定)

#include 
#include 

#define MAX_INT 0x7fffffff

int N, M;
/* map[i]记录了i结点到其他结点的最短距离,
   path[i][j]记录结点i到结点j的距离,
   processed[i]记录了在使用dijkstra的过程中,i结点是否已计算过
 */
int path[1010][1010], map[1010][1010], processed[1010];

void init_single_source(int *map, int size, int src)
{
    int i;
    for (i=1 ; i    {
        map[i] = MAX_INT;
    }
    map[src] = 0;
}

/* 采用遍历的方式寻找最小值, 低效,但是简单 -_-!*/
int extract_min(int *map, int size)
{
    int i, min = MAX_INT;
    int min_index;
    for (i=1 ; i    {
        if (map[i] < min && 0 == processed[i])
        {
            min = map[i];
            min_index = i;
        }
    }
    processed[min_index] = 1;
    return min_index;
}

void clear_data()
{
    memset(path, 0, sizeof(path));
    memset(map, 0, sizeof(map));
}

int main(int argc, char *argv[])
{
    int i, j, k, src, des, distance, min_index ,ret_min;
    while (EOF != scanf("%d %d", &N, &M))
    {
        clear_data();
        for (i=0 ; i        {
            scanf("%d %d %d", &src, &des, &distance);
            path[src][des] = distance;
        }
        for (k=1 ; k        {
            memset(processed, 0, sizeof(processed));
            init_single_source(map[k], N, k);
            /* do release, 路径的release操作 */
            for (i=1 ; i<=N ; i++)
            {
                min_index = extract_min(map[k], N);
                for (j=1 ; j<=N ; j++)
                {
                    if (0 != path[min_index][j])
                    {
                        if (map[k][min_index] + path[min_index][j] < map[k][j])
                            map[k][j] = map[k][min_index] + path[min_index][j];
                    }
                }
            }
        }
        /* find min path */
        ret_min = MAX_INT;
        des = 1;
        for (i=1 ; i        {
            if (MAX_INT == map[1][i] || 0 == map[1][i] || MAX_INT == map[i][1] || MAX_INT == map[i][1])
                continue;
            if (map[1][i] + map[i][1] < ret_min)
            {
                ret_min = map[1][i] + map[i][1];
                des = i;
            }
        }
        printf("%d %d\n", des, ret_min);
    }
}
阅读(927) | 评论(0) | 转发(0) |
0

上一篇:Linux面试题

下一篇:Makefile中的shell

给主人留下些什么吧!~~