用memset设置无穷大无穷小

本文介绍了一种使用memset函数将数组元素初始化为无穷大的技巧,适用于C/C++编程中的特定场景,尤其是当需要将整型数组的所有元素设置为相同的最大值时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memeset是以字节为单位进行赋值的,对字符数组可以直接用。

但对于int数组就不行了。

但设置无穷大来说有个技巧:

如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))

还有赋值无穷小。。。

 

转载于:https://www.cnblogs.com/TWS-YIFEI/p/6337616.html

#include<bits/stdc++.h> using namespace std; const int N=1e6+6; const int mod=100003; int n,m,u,v,k,e; int cnt[N],val[N]; vector g[N]; queue q; //unordered_map<int,unordered_set> mp; void bfs() { memset(val,0x3f3f3f3f,sizeof(val)); q.push(1); val[1]=0;//起点边权无穷小 cnt[1]=1;//到起点的路径为1 while(!q.empty()) { e=q.front(); q.pop(); k=val[e]+1;//在最短路径上扩展 for(int &it:g[e]) { if(k<val[it]) {//如果有更短的路径,继承上一个点的路径 val[it]=k; //更新权重 cnt[it]=cnt[e]; //继承路径 q.push(it); } else if(k==val[it])//如果权重相同,累加路径 cnt[it]=(cnt[it]+cnt[e])%mod; } }//遍历的是e连接的边,通过e到达it的路径若无重边则可以直接继承 //若有重边,若重边权重不相同,在取最短路径后继承也不会影响结果,否则可能得到多个k==val[it]导致重复计数 //题目范围太大,无法直接开二维数组判重边,可以使用哈希表判重 //但判重后结果不对,说明题目对重边会重复计数,那么就不用判重 if(cnt[n]==0) { cout<<0; return; } for(int i=1; i<=n; i++) cout<<cnt[i]<<'\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>m; for(int i=1; i<=m; i++) {//自环权重无限增大,dij天然避免 cin>>u>>v; // if(!mp[u].count(v)&&!mp[v].count(u)) { // mp[u].insert(v); // mp[v].insert(u); g[u].push_back(v); g[v].push_back(u); // } } bfs(); return 0; }# P1144 最短路计数 题目描述 给出一个 N N 个顶点 M M 条边的无向无权图,顶点编号为 1 ∼ N 1∼N。问从顶点 1 1 开始,到其他每个点的最短路有几条。 输入格式 第一行包含 2 2 个正整数 N , M N,M,为图的顶点数与边数。 接下来 M M 行,每行 2 2 个正整数 x , y x,y,表示有一条连接顶点 x x 和顶点 y y 的边,请注意可能有自环与重边。 输出格式 共 N N 行,每行一个非负整数,第 i i 行输出从顶点 1 1 到顶点 i i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 a n s   mod   100003 ansmod100003 后的结果即可。如果无法到达顶点 i i 则输出 0 0。 输入输出样例 #1 输入 #1 5 7 1 2 1 3 2 4 3 4 2 3 4 5 4 5 输出 #1 1 1 1 2 4 说明/提示 1 1 到 5 5 的最短路有 4 4 条,分别为 2 2 条 1 → 2 → 4 → 5 1→2→4→5 和 2 2 条 1 → 3 → 4 → 5 1→3→4→5(由于 4 → 5 4→5 的边有 2 2 条)。 对于 20 % 20% 的数据, 1 ≤ N ≤ 100 1≤N≤100; 对于 60 % 60% 的数据, 1 ≤ N ≤ 10 3 1≤N≤10 3 ; 对于 100 % 100% 的数据, 1 ≤ N ≤ 10 6 1≤N≤10 6 , 1 ≤ M ≤ 2 × 10 6 1≤M≤2×10 6 。 我的代码对最短路计数的理解是否正确?
最新发布
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值