王八变成汤 2022-03-01 22:01 采纳率: 0%
浏览 26

2^31-1 和 2147483647 的区别

更该两个数值 结束不一样
https://loj.ac/p/10064

问题相关代码,请勿粘贴截图

#include<bits/stdc++.h>
using namespace std;
const int mod=2147483647,N=1111,inf=0x3f3f3f;//mod的值
typedef long long ll;
ll a[N][N],vis[N],book[N],n,m,ans=0;
ll cnt[N];
void dijkstra()
{
    for(int i=1;i<=n;i++) vis[i]=a[1][i];
    vis[1]=0;
    book[1]=1;
    for(int i=1;i<=n;i++){
        int MIN=inf,k;
        for(int j=1;j<=n;j++){
            if(!book[j]&&vis[j]<MIN){
                MIN=vis[j];
                k=j;
            }
        }
        book[k]=1;
        for(int j=1;j<=n;j++){
            if(vis[j]>vis[k]+a[k][j])
                vis[j]=vis[k]+a[k][j];
        } 
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==j) a[i][j]=0;
            else a[i][j]=inf;
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        if(a[x][y]>z)
            a[x][y]=a[y][x]=z;
    }
    memset(book,0,sizeof(book));
    dijkstra();
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j&&vis[j]==vis[i]+a[i][j])
                cnt[j]++;
    ans=1;
    for(int i=1;i<=n;i++)
        if(cnt[i]){
            ans*=cnt[i];
            ans%=mod;
        }
    cout<<ans<<endl;
 } 
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • _GX_ 2022-03-01 22:28
    关注

    C++默认用int类型计算,而(1<<31)-1按有符号整型计算是溢出的,C++对有符号整型溢出的行为没有定义,因此其行为依赖于编译器实现。
    https://en.cppreference.com/w/cpp/language/operator_arithmetic#Overflows

    When signed integer arithmetic operation overflows (the result does not fit in the result type), the behavior is undefined,

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错