【发布时间】:2016-01-07 06:48:43
【问题描述】:
我遇到了一个问题,要求我在任何给定顶点对之间找到最大的最便宜路径。我为解决方案实现了 Floyd Warshall 算法。但是我的程序中有一个奇怪的错误。我使用 intmax_t 来避免溢出,但是如果我使用 INTMAX_MAX 而不是 INT_MAX 来表示两个顶点没有直接连接,我会得到错误的答案。为什么会这样?
#include <bits/stdc++.h>
using namespace std;
struct _ { ios_base::Init _i; _() { cin.sync_with_stdio(0); cin.tie(0); } } _;
#define endl '\n'
#define int intmax_t
#define in(x) for (auto& i: x)
#define test int _t; cin >> _t; for (int i=1; i<=_t; i++) {
signed main()
{
int v, e, ans=INT_MIN;
cin >> v >> e;
int g[v+1][v+1];
for (int i=1; i<=v; i++)
for (int j=1; j<=v; j++)
g[i][j]=INT_MAX;
for (int i=0; i<e; i++)
{
int x, y, p;
cin >> x >> y >> p;
g[x][y]=g[y][x]=p;
}
for (int i=1; i<=v; i++)
for (int j=1; j<=v; j++)
for (int k=1; k<=v; k++)
g[j][k]=min(g[j][k], g[j][i]+g[i][k]);
for (int i=1; i<=v; i++)
for (int j=1; j<=v; j++)
if (g[i][j]!=INT_MAX && i!=j)
ans=max(ans, g[i][j]);
cout << ans;
}
如果我将 INT_MIN 替换为 INTMAX_MIN 并将 INT_MAX 替换为 INTMAX_MAX,则会得到不正确的结果。
示例案例:
使用 INT_MAX:http://ideone.com/ffmv7P
使用 INTMAX_MAX:http://ideone.com/vjMCuE
附录:该程序是专门为解决竞争性编程问题而编写的。请将您的“正确编码实践”建议留给自己。如果您愿意回答,您会发现预处理器指令在这种情况下对可读性造成的影响很小或没有问题。他们在那里是有原因的,我并不愚蠢。如果您没有竞争性编程经验,请不要将责任归咎于我。谢谢。
【问题讨论】:
-
你认为 INTMAX_MAX + INTMAX_MAX 是什么?另外,说真的,清理那些恶心的宏。
-
现在我也看到了
signed main()... -
哦,谢谢。我应该仔细选择无限值。关于“恶心的宏”,只有一个宏,为什么恶心?这是一个有竞争力的编程问题,
in宏有时会派上用场以节省时间。我的问题甚至与此无关,它不会影响我所问的内容。签名是为了补偿 intmax_t 指令。 -
#define int intmax_t-- 我强烈建议不要这样做。使用typedef,而不是宏,并给它一个除int以外的名称。 -
首先是
using namespace std;,然后是#define endl '\n'...真的吗?为什么?
标签: c++ numeric-limits