HDOJ——2066(dijkstra)

一个人的旅行

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 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10

Sample Output
  
  
9

Author
Grass

Source

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 100000000

int 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值