一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8758 Accepted Submission(s): 2997
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
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
9
编译错误
(一)报错位置: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;
}