从控制台和文件读取相同的数据时,程序的行为会有所不同

Program behaves differently when read same data from console and file

提问人:EchoInVoid 提问时间:4/2/2023 最后编辑:EchoInVoid 更新时间:4/2/2023 访问量:49

问:

这是我的代码。 它用于使用 Dijkstra 算法求解单源最短路径问题。

#include <cstdio>
using namespace std;

int mp[2505][2505];
int n, m, s, t;
const int INF = INT_MAX/4;

int main()
{
    // freopen(".\\IO\\stdin.in", "r", stdin);

    for (int i=0; i<2505; i++)
        for (int j=0; j<2505; j++)
            mp[i][j] = i==j ? 0 : INF;
    
    scanf("%d%d%d%d", &n, &m, &s, &t);
    for (int i=0; i<m; i++)
    {
        int u, v, t;
        scanf("%d%d%d", &u, &v, &t);
        mp[u][v] = mp[v][u] = t;
    }

    int dis[3000];
    for (int i=1; i<=n; i++)
        dis[i] = INF;
    dis[s] = 0;

    bool walked[2505];
    memset(walked, 0, sizeof(walked));
    for (int i=1; i<=n; i++)
    {
        int minN = -1, minV = INF;
        for (int j=1; j<=n; j++)
        {
            if (walked[j]) continue;
            if (dis[j] < minV)
                minV=dis[j], minN=j;
        }

        for (int p=1; p<=n; p++)
            if (dis[minN] + mp[minN][p] < dis[p])
                dis[p] = dis[minN] + mp[minN][p];
        walked[minN] = 1;
    }

    printf("%d\n", dis[t]);
    return 0;
}

我尝试将输入数据粘贴到控制台中,并得到了正确的答案。
但是当我写(就像开头的注释一样),将数据放入正确的文件中并运行程序时,它会打印.
1559freopen(".\\IO\\stdin.in", "r", stdin);main()0

输入数据有 6000+ 行,所以我把它放在 ubuntu pastebin。https://pastebin.ubuntu.com/p/7WhKQW2pZj/

其他信息: Windows 10
符合命令: C++ 标准:

C++11
g++ a.cpp -o a.exe -Wall

C++ 文件- IO

评论

2赞 PaulMcKenzie 4/2/2023
C++ standard: C++11-- 代码中没有任何内容专门涉及 C++11。除了那个非标准标头,你的整个代码都是 .#include <bits/stdc++.h>C
1赞 paddy 4/2/2023
是返回有效的流,还是返回 NULL?freopen
1赞 Evg 4/2/2023
什么是调试器,它如何帮助我诊断问题?|为什么我不应该 #include < bits/stdc++.h>|为什么使用命名空间 std; 被认为是不好的做法?
1赞 PaulMcKenzie 4/2/2023
如果这让你很恼火 -- 你应该发布其他人可以编译的代码并帮助。这是更改: .简单地拥有它有那么难吗?这不是一个比赛网站--这里没有比赛,只是人们试图帮助你。#include <cstdio>
1赞 PaulMcKenzie 4/2/2023
@EchoInVoid -- 使用该标头的问题在于,即使是在比赛中,您编写的代码可能无法使用该标头进行编译,或者由于该标头而行为不同。例如,如果你编写一个函数,实际将调用哪个函数,你的函数,或者?如果你有一个函数,哪个函数将被调用,你的还是?这也是为什么很危险。因此,您将输掉竞争,因为您陷入了编译器错误,或者您的代码正在做一些奇怪的事情。swapswapswapstd::swapgcdgcdstd::gcdusing namespace std;

答: 暂无答案