C++读入优化

有些题目,输入量很大,为了卡常,我们就要用读入优化。
C++里,于stdio.h(或cstdio)的getchar()函数可要比scanf,cin快多了。
于是我们就搞了一个读入优化:

#define IN(x,a,b) (a<=x && x<=b)
void input(int& x)
{
    char ch=getchar();
    while (!IN(ch,'0','9'))
        ch=getchar();
    x=0;
    do
    {
        x=x*10+ch-48;
        ch=getchar();
    }
    while (IN(ch,'0','9'));
}

如果有兴趣,你可以改成模板之类的玩意儿。

转载于:https://www.cnblogs.com/jz-597/p/11145316.html

### Dijkstra算法的堆优化实现 为了提高Dijkstra算法在处理稀疏图时的性能,采用优先队列(最小堆)作为数据结构能够显著提升效率[^2]。下面展示了一个基于C++标准库`<queue>`中的`priority_queue`容器适配器来实现带权重最短路径查找的方法。 #### 定义边和节点结构体 首先定义用于表示加权有向图中每条边上连接两个顶点以及对应代价的数据类型: ```cpp struct Edge { int target; long weight; bool operator>(const Edge& e) const { return this->weight > e.weight; } }; ``` 这里重载了大于运算符以便于后续构建最大/最小堆时比较元素大小。 #### 初始化变量并读入输入数据 接着初始化一些必要的全局变量,并通过文件流或其他方式获取待求解问题的具体参数值,比如起点编号、终点集合等信息。 ```cpp #include <vector> using namespace std; // Adjacency list representation of graph. vector<vector<Edge>> adjList(numNodes); void addEdge(int from, int to, long cost){ adjList[from].push_back({to,cost}); } ``` 上述代码片段展示了邻接表形式存储无向图的方式;对于有权重的情况,则需额外记录各条弧上的具体数值。 #### 实现核心逻辑函数 最后编写执行实际操作的核心部分——即寻找单源到其余所有可达结点间距离最短的一系列指令集: ```cpp #include <climits> // For INT_MAX definition. pair<bool,vector<long>> dijkstraHeapOptimized(int startNode){ vector<long> distTo(numNodes,INT_MAX); // Distance array initialized with infinity. priority_queue<pair<int,long>,vector<pair<int,long>>,greater<>> pq; // Min-heap based on distance values. distTo[startNode]=0L;pq.push(make_pair(startNode,distTo[startNode])); while(!pq.empty()){ pair<int,long> current=pq.top();pq.pop(); if(current.second!=distTo[current.first]) continue;// Skip outdated entries for(const auto &edge : adjList[current.first]){ if(distTo[edge.target]>current.second+edge.weight){ distTo[edge.target]=current.second+edge.weight; pq.emplace(edge.target,distTo[edge.target]); } } } bool allReachable=true; for(auto d:distTo){ if(d==INT_MAX){allReachable=false;break;} } return make_pair(allReachable,distTo); } ``` 此版本利用STL提供的高效二叉堆实现了动态更新候选列表的功能,在遍历过程中不断调整当前已知最优解直至收敛至最终状态为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值