当前位置: 首页 > news >正文

常用数据生成器

期望高度 \(O(\log)\)

/*
生成期望树高 O(logn) 级别的树
生成方法:钦定 1 为根,对于后续的节点 i,随机在 [1,i-1] 中选取一个点作为父亲
打乱方法:对所有点重新随机编号
*/
#include<random>
#include<iostream>
#include<algorithm>
#include<fstream>
#include<vector>
using namespace std;
typedef long long ll;
mt19937_64 getrnd(__builtin_ia32_rdtsc());
int rnd(ll l,ll r){return getrnd()%(r-l+1)+l;}
constexpr int N=1e7+10;
int n,p[N];
struct edge{int u,v;};
vector<edge> e;
void shuf(){for(int i=1;i<=n;i++) p[i]=i;shuffle(p+1,p+1+n,getrnd);for(edge &x:e){x.u=p[x.u];x.v=p[x.v];}
}
int main(){ofstream out("1.in");n=1e5;//节点数out<<n<<'\n';for(int i=2;i<=n;i++)e.push_back({i,rnd(1,i-1)});shuf();//随机打乱for(edge &x:e)out<<x.u<<' '<<x.v<<'\n';return 0;
}
/*
对于 n=1e5:
--以1为根:
----调用 shuf,平均树高在 20 左右浮动
----不调用 shuf,平均树高在 12 左右浮动
--随机选根:
----调用 shuf,平均树高在 22 左右浮动且方差较大
----不调用 shuf,平均树高在 20 左右浮动且方差较大
*/

期望高度 \(O(\sqrt n)\)

/*
生成期望树高 O(sqrtn) 级别的树
生成方法:随机生成一个 Prüfer 序列,根据此构造一棵树
打乱方法:对所有点重新随机编号
*/
#include<random>
#include<iostream>
#include<algorithm>
#include<fstream>
#include<queue>
using namespace std;
typedef long long ll;
mt19937_64 getrnd(__builtin_ia32_rdtsc());
int rnd(ll l,ll r){return getrnd()%(r-l+1)+l;}
constexpr int N=1e7+10;
int n,p[N],deg[N];
struct edge{int u,v;};
vector<int> prufer;
vector<edge> e;
priority_queue<int,vector<int>,greater<int>> leaf;
void prufer_decoding(){for(int i=1;i<=n;i++) deg[i]=1;for(int &v:prufer) ++deg[v];for(int i=1;i<=n;i++) if(deg[i]==1) leaf.push(i);for(int &v:prufer){int u=leaf.top();leaf.pop();e.push_back({u,v});--deg[u],--deg[v];if(deg[v]==1) leaf.push(v);}vector<int> remain;for(int i=1;i<=n;i++) if(deg[i]==1) remain.push_back(i);e.push_back({remain[0],remain[1]});
}
void shuf(){for(int i=1;i<=n;i++) p[i]=i;shuffle(p+1,p+1+n,getrnd);for(edge &x:e){x.u=p[x.u];x.v=p[x.v];}
}
int main(){ofstream out("1.in");n=1e5;//节点数out<<n<<'\n';for(int i=1;i<=n-2;i++) prufer.push_back(rnd(1,n));//随机生成 Prüfer 序列prufer_decoding();//根据 Prüfer 序列还原树shuf();//随机打乱for(edge &x:e)out<<x.u<<' '<<x.v<<'\n';return 0;
}
http://www.hskmm.com/?act=detail&tid=13590

相关文章:

  • 基于RSSI修正的定位算法分析
  • c# 反射动态添加Attribute
  • MyBatis-Plus 全方位深度指南:从入门到精通
  • 鸿蒙项目实战(十):web和js交互
  • 【9.24 直播】集群数据管理实战:时序数据库 IoTDB 数据分区、同步与备份详解
  • 函数计算进化之路:AI 应用运行时的状态剖析
  • 01_进程与线程
  • 第六届医学人工智能国际学术会议(ISAIMS 2025)
  • redis 6.0 多线程
  • docker 常用命令与端口映射
  • linux重启mysql服务,几种常见的方法
  • opencv学习记录3
  • 统计分析神器 NCSS 2025 功能亮点+图文安装教程
  • mysql常用语句,常用的语句整理
  • 当写脚本循环更新几百万数据发现很慢怎么办 - 孙龙
  • 服装采购跟单系统的高效管理实践 - 详解
  • 和汽车相关的国内期刊
  • 服务器CPU、内存、磁盘、网络使用率,东方通CPU使用率东方通内存使用率监控脚本
  • 3 网络基础知识+web基础知识+部署Server
  • wxpython图形界面_01_最小基本结构
  • 服务器总资源监控脚本
  • 一个身体,两个身体
  • 006_字典操作
  • 简单理解java虚拟机
  • 东方通中间件嵌入式监控脚本
  • 004_元组操作
  • 个人作业-第二次软件工程作业
  • 代码流水线
  • 洛谷题单指南-进阶数论-P1516 青蛙的约会
  • electron中的几个概念