大佬帮我看看为什么会编译错误
2025-09-30 14:27:04
发布于:浙江
#include<bits/stdc++.h>
using namespace std;
typedef long long apple;
const apple MAXN=1e6+10;
const apple N=2e9;
apple n,m,s,ans,dis[MAXN],vis[MAXN],pear[MAXN][MAXN];
void poop(apple s){
for(apple i=0;i<=n;i++) dis[i]=N;
dis[s]=0;
for(apple j=1;j<=n;j++){
apple u=0;
for(apple j=1;j<=n;j++){
if(!vis[j]&&dis[j]<dis[u]) u=j;
}
vis[u]=1;
for(apple j=1;j<=n;j++){
if(pear[u][j]){
apple w=pear[u][j];
if(dis[j]>dis[u]+w) dis[j]=dis[u]+w;
}
}
}
}
int main(){
cin>>n>>m>>s;
for(apple i=1;i<=m;i++){
apple u,v,w;
cin>>u>>v>>w;
apple tmp=pear[u][v]?pear[u][v]:N;
pear[u][v]=min(tmp,w);
}
poop(s);
for(apple i=1;i<=n;i++){
if(dis[i]!=N) cout<<dis[i]<<" ";
else cout<<-1<<" ";
}
return 0;
}
全部评论 3
1.你声明了 pear[MAXN][MAXN] 这样的二维数组,其中 MAXN = 1e6 + 10,那么这个数组总共会占用约8TB这显然远远超出了任何正常程序允许的内存限制(通常只有几百 MB)。所以,即使逻辑正确,程序也会因为内存超限(MLE)而失败。
2.你在主循环里用了三重嵌套的 for 循环结构(虽然中间变量名重复了,但我们先忽略语法细节),外层遍历 n 次,内层又分别遍历所有点来找最小值、再遍历所有点做松弛。这意味着时间复杂度接近 O(n的2次方),当n=10的6次方时,次数将达到 10的12次方,远超现代计算机在 1 秒内的处理能力
3.你在外层循环用了变量 j,然后在内部两个循环也用了同名变量 j,而且嵌套层级不同。C++ 中这种写法会导致变量覆盖,使得外层循环的 j 被修改,从而可能造成死循环或不可预测的行为
4.你将初始距离设为 N = 2e9,但注意边权最大可以达到10的9次方,且最多有2*10的6次方条边,最坏情况下路径长度可能是10的15次方,所以你设置的“无穷大”是否足够大?会不会在比较时发生误判?,此外,dis 数组只初始化到了 n,但下标是从 1 开始使用的,这点需要注意数组越界风险。1周前 来自 天津
11.你声明了 pear[MAXN][MAXN] 这样的二维数组,其中 MAXN = 1e6 + 10,那么这个数组总共会占用约8TB这显然远远超出了任何正常程序允许的内存限制(通常只有几百 MB)。所以,即使逻辑正确,程序也会因为内存超限(MLE)而失败。
2.你在主循环里用了三重嵌套的 for 循环结构(虽然中间变量名重复了,但我们先忽略语法细节),外层遍历 n 次,内层又分别遍历所有点来找最小值、再遍历所有点做松弛。这意味着时间复杂度接近 O(n的2次方),当n=10的6次方时,次数将达到 10的12次方,远超现代计算机在 1 秒内的处理能力
3.你在外层循环用了变量 j,然后在内部两个循环也用了同名变量 j,而且嵌套层级不同。C++ 中这种写法会导致变量覆盖,使得外层循环的 j 被修改,从而可能造成死循环或不可预测的行为
4.你将初始距离设为 N = 2e9,但注意边权最大可以达到10的9次方,且最多有2*10的6次方条边,最坏情况下路径长度可能是10的15次方,所以你设置的“无穷大”是否足够大?会不会在比较时发生误判?,此外,dis 数组只初始化到了 n,但下标是从 1 开始使用的,这点需要注意数组越界风险。以上皆为AI生成
1周前 来自 浙江
0问题:
1.你声明了 pear[MAXN][MAXN] 这样的二维数组,其中 MAXN = 1e6 + 10,那么这个数组总共会占用约8TB这显然远远超出了任何正常程序允许的内存限制(通常只有几百 MB)。所以,即使逻辑正确,程序也会因为内存超限(MLE)而失败。
2.你在主循环里用了三重嵌套的 for 循环结构(虽然中间变量名重复了,但我们先忽略语法细节),外层遍历 n 次,内层又分别遍历所有点来找最小值、再遍历所有点做松弛。这意味着时间复杂度接近 O(n的2次方),当n=10的6次方时,次数将达到 10的12次方,远超现代计算机在 1 秒内的处理能力
3.你在外层循环用了变量 j,然后在内部两个循环也用了同名变量 j,而且嵌套层级不同。C++ 中这种写法会导致变量覆盖,使得外层循环的 j 被修改,从而可能造成死循环或不可预测的行为
4.你将初始距离设为 N = 2e9,但注意边权最大可以达到10的9次方,且最多有2*10的6次方条边,最坏情况下路径长度可能是10的15次方,所以你设置的“无穷大”是否足够大?会不会在比较时发生误判?,此外,dis 数组只初始化到了 n,但下标是从 1 开始使用的,这点需要注意数组越界风险。以上皆为AI生成
1周前 来自 四川
0666
1周前 来自 浙江
0
有帮助,赞一个