HDOJ——2066(dijkstra)

来源:互联网 发布:c语言重点知识总结 编辑:程序博客网 时间:2024/06/05 20:42

一个人的旅行

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8758 Accepted Submission(s): 2997


Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。

Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。

Output
输出草儿能去某个喜欢的城市的最短时间。

Sample Input
6 2 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10

Sample Output
9

Author
Grass

Source
RPG专场练习赛

Recommend
lcy

编译错误

(一)报错位置:36       if(min==inf)

                    37       break;

错误:Cpp1.cpp(36) : error C2143: syntax error : missing ')' before ';'
            Cpp1.cpp(36) : error C2059: syntax error : ')'
            Cpp1.cpp(37) : warning C4390: ';' : empty controlled statement found; is this the intent?

出错原因:第四行:# define inf 100000000;

多了一个分号!!!!


(二)错误:0_0_6251625_15363.cpp0_0_6251625_15363.cpp(19) : error C2872: “max” : 不明确的符号  

可能是“0_0_6251625_15363.cpp(6) : int max” 或 “max”

出错原因:【转自http://topic.csdn.net/t/20030416/11/1667758.html】

首先,max()在标准C++中的确是个函数而非宏.它在不同编译系统中的实际定义如下:
===========================================================
linux 下的 g++,头文件 <algorithm>
template <class _Tp>
inline const _Tp& max(const _Tp& __a, const _Tp& __b) {
return __a < __b ? __b : __a;
}
===========================================================
windows 下的 VC6,头文件 <algorithm> (最新的VS.net没试过,不敢妄言)
template <class _Ty> inline
const _Ty& _cpp_max(const _Ty& _X, const _Ty& _Y)
{return (_X < _Y ? _Y : _X); }
===========================================================

g++按照标准C++的规定把它定义为max();而VC6自作主张把它变成了_cpp_max().
事实上,我提问时所附的源代码是符合标准C++规则的,在g++下顺利编译,而由于VC6把max()变成_cpp_max(),

导致无法编译.

要在VC6用max(),只能退而求其次使用_cpp_max().或_MAX().
因为在头文件algorithm包含的另一个头文件xutility里有一句 #define _MAX _cpp_max

另外有一个相关的宏__max, 是定义在stdlib.h中的:#define __max(a,b) (((a) > (b)) ? (a) : (b)),

不过__max不是标准C++,是以前的C留下来的.

解决方案:把using namespace std;具体化变为:using std::cin;using std::cout;using std::endl;

或者直接把max换成M



//HDOJ——2066  简单的dijkstra应用#include<iostream>using std::cin;using std::cout;using std::endl;#define inf 100000000int max;int T,S,D;int a,b,c;int s[1002],d[1002];int map[1002][1002];int dist[1002];int vi[1002];int dijkstra(int e){    int min;int dir;for(int i=0;i<=max;i++){    vi[i]=0;dist[i]=map[e][i];}dist[e]=0;             //初始化源的距离vi[e]=1;               //标记访问for( i=0;i<=max;i++)//遍历所有的城市{    min=inf;for(int j=0;j<=max;j++)    if(min>dist[j]&&!vi[j]){    min=dist[j];dir=j;}               //找到最小距离的点if(min==inf)            break;     //没有与之相邻的点,跳出vi[dir]=1;          //标记访问for( j=0;j<=max;j++)            if(dist[j]>dist[dir]+map[dir][j]&&!vi[j])                dist[j]=dist[dir]+map[dir][j];    }                       //对于每个与u相邻的点v,如果dist[u]+w[u,v]<dist[v],那么把dist[v]更新成更短的距离dist[u]+w[u,v]。此时到点v的最短路径上,前一个节点即为u    min=inf;    for( i=0;i<D;i++)        if(min>dist[d[i]])            min=dist[d[i]];    return min;        //    最小距离} int main(){    int min;    while(cin >> T >> S >>D){        for(int i=0;i<1002;i++)            for(int j=0;j<1002;j++)                map[i][j]=inf;max = 0;        for( i=0;i<T;i++)        {    cin >> a >> b >> c ;            if(map[a][b]>c)                map[a][b]=map[b][a]=c;           if(max<a)                max=a;            if(max<b)                max=b;}    for(i=0;i<S;i++)    {        cin >> s[i] ;    }    for(i=0;i<D;i++)    {        cin >> d[i];    }min = inf ;for(i=0;i<S;i++){     if(min>dijkstra(s[i]))    min=dijkstra(s[i]);}    cout << min <<endl ;    }return 0;}



原创粉丝点击