东八区第一败犬 2024-05-22 15:54 采纳率: 100%
浏览 3
已结题

关于#c++#的问题:为什么const就可以, 用define的时候就会有错

为什么const就可以啊
用define的时候就会有错


#include<iostream>
#include<vector>
#include<queue>
#define INF 2e32-2//这里用define就只能通过一个检测点
//而如果用const long long INF=2e32-2;就都能通过
#define N 300002
using namespace std;

int n, m;//n个点m条边

struct Point {
    int id;
    long long dis;
    Point(int i,long long d) {
        id = i; dis = d;
    }
    bool operator<(const Point& p)const {
        return dis > p.dis;
    }
};

long long Distance[N];

struct Edge {
    int from;
    int to;
    long long w;
    Edge(int f, int t, long long ww) {
        from = f; to = t;
        w = ww;
    }
};

vector<Edge>edge[N];

int start;

void Dijkstra() {
    for (int i = 1; i <= n; i++) {
        Distance[i] = INF;
    }
    Distance[start] = 0;

    int* done = new int[N] {0};

    priority_queue<Point>* point = new priority_queue<Point>;
    point->push(Point(start, 0));

    while (!point->empty()) {
        Point p = point->top();
        point->pop();

        if (done[p.id])
            continue;

        done[p.id] = 1;

        for (int i = 0; i < edge[p.id].size(); i++) {
            Edge e = edge[p.id][i];

            if (done[e.to])
                continue;

            if (Distance[e.to] > p.dis + e.w) {
                Distance[e.to] = p.dis + e.w;
                point->push(Point(e.to, Distance[e.to]));
            }
        }
    }
    delete point;
    delete[] done;
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {

        int u, v;
        long long w;
        cin >> u >> v >> w;
        edge[u].push_back(Edge(u, v, w));

    }

    start = 1;

    Dijkstra();

    for (int i = 1; i <= n; i++) {
        if (Distance[i] >= INF)cout << "-1 ";
        else
            cout << Distance[i] << " ";
    }
}

题目:

img

用define的结果

img

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-05-22 15:54
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您想要解决的问题

    您提问的目的是解决在C++中使用#define宏定义与使用const常量定义时,为什么const可以正常工作,而#define会导致程序在某些测试点上出错的问题。

    图片内容

    • 第一张图片:题目描述,说明了蓝桥王国的题目背景,要求编写程序计算从皇宫到每个建筑的最短路径。
    • 第二张图片:测试用例的检测结果,显示了不同测试用例的状态、用时、内存使用情况以及代码执行结果。

    问题出现原因

    使用#define宏定义时,预处理器会在编译之前将所有的INF宏替换为2e32-2。这可能导致浮点数精度问题,因为2e32-2不是一个精确的数值表示,特别是当它被用于比较时。而const定义的常量在编译时会进行类型检查和优化,确保了数值的精确性。

    问题解决方案

    最优的解决方案是使用const定义而不是#define来定义常量。这样可以避免宏替换可能带来的精度问题,并且const常量在编译时会被优化,有助于提高代码效率。

    提供代码

    #include<iostream>
    #include<vector>
    #include<queue>
    const long long INF = 2e32 - 2; // 使用const定义INF常量
    #define N 300002
    using namespace std;
    
    // ... 其余代码保持不变 ...
    
    int main() {
        // ... 其余代码保持不变 ...
    }
    

    代码运行方式

    • 确保您的开发环境支持C++。
    • 将上述代码复制到C++编译器中。
    • 编译并运行程序。

    代码预期运行结果

    预期代码将能够正确处理所有测试用例,计算出从皇宫到每个建筑的最短路径,并输出正确的结果。

    推荐相关链接

    请注意,以上链接仅为示例,可能需要根据实际情况进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月3日
  • 已采纳回答 6月25日
  • 创建了问题 5月22日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见