浅谈【树】的数据生成

本人水平有限,题解不到为处,请多多谅解

本蒟蒻谢谢大家观看

如何让一份自己写的程序跑一遍随机造的数据,这时我们要用到

数据生成。

本文只介绍树的生成(我是不会告诉你我现在只会树)

题目:传送门

普通树的生成:(随机生成10个数据)

注意:最后第10个数据要手动调试,虽然我也不知道为什么。

以下上半部分是树,下半部分是题目要求

code:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 inline int random(int x) {
 5     return (rand()*RAND_MAX+rand())%x;
 6 }
 7 inline int rendom(int l,int r) {
 8     return (rand()*RAND_MAX+rand())%(r-l+1)+l;
 9 }
10 using namespace std;
11 int main(){
12 //    freopen("bbb.in","r",stdin);
13     srand(time(0));
14     char si[]="bbb1.in",so[]="bbb1.out";
15     for(int i=1;i<=10;i++) {
16         freopen(si,"w",stdout);
17         si[3]=so[3]=‘1‘+i;
18         cerr<<i<<endl;
19         int x=random(100000);
20         printf("%d\n",x);
21         for (int i=2;i<=x;i++){
22             int fa=random(i-1)+1;
23             int val=random(100000)+1;
24             //int a=random(10),b=random(10),c=random(10);
25             printf("%d %d %d\n",fa,i,val);
26         }int m=random(100000);
27         printf("%d\n",m);
28     //    set<int> s;
29         for (int i=1;i<=m;i++){
30             int a=rendom(1,x);
31             int b=rendom(1,x);
32             int c=rendom(1,x);
33             int d=rendom(1,x);
34             if(a>b)swap(a,b);
35             if(c>d)swap(c,d);
36             printf("%d %d %d %d\n",a,b,c,d);
37     //        while(s.size()<=4){
38     //            s.insert(random(1,1e5));
39     //        }
40     //        while(s.size()){
41     //            s.insert(random(1,1e5));
42     //        }
43         }
44     }
45     return 0;
46 }

同理,随机生成树的链如下:

code:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 inline int random(int x) {
 5     return (rand()*RAND_MAX+rand())%x;
 6 }
 7 inline int rendom(int l,int r) {
 8     return (rand()*RAND_MAX+rand())%(r-l+1)+l;
 9 }
10 using namespace std;
11 int main(){
12 //    freopen("bbb.in","r",stdin);
13     srand(time(0));
14     char si[]="bbb2.in",so[]="bbb2.out";
15 //    for(int i=1;i<=10;i++) {
16         freopen(si,"w",stdout);
17 //        si[3]=so[3]=‘1‘+i;
18 //        cerr<<i<<endl;
19         int x=random(100000);
20         printf("%d\n",x);
21         for (int i=2;i<=x;i++){
22             int fa=rendom(max(1,i-10),i-1);
23             int val=random(10000)+1;
24             //int a=random(10),b=random(10),c=random(10);
25             printf("%d %d %d\n",fa,i,val);
26         }int m=random(100000);
27         printf("%d\n",m);
28     //    set<int> s;
29         for (int i=1;i<=m;i++){
30             int a=rendom(1,x);
31             int b=rendom(1,x);
32             int c=rendom(1,x);
33             int d=rendom(1,x);
34             if(a>b)swap(a,b);
35             if(c>d)swap(c,d);
36             printf("%d %d %d %d\n",a,b,c,d);
37     //        while(s.size()<=4){
38     //            s.insert(random(1,1e5));
39     //        }
40     //        while(s.size()){
41     //            s.insert(random(1,1e5));
42     //        }
43         }
44 //    }
45     return 0;
46 }

随机生成菊花图如下:

code:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 inline int random(int x) {
 5     return (rand()*RAND_MAX+rand())%x;
 6 }
 7 inline int rendom(int l,int r) {
 8     return (rand()*RAND_MAX+rand())%(r-l+1)+l;
 9 }
10 using namespace std;
11 int main(){
12 //    freopen("bbb.in","r",stdin);
13     srand(time(0));
14     char si[]="bbb3.in",so[]="bbb1.out";
15 //    for(int i=1;i<=10;i++) {
16         freopen(si,"w",stdout);
17 //        si[3]=so[3]=‘1‘+i;
18 //        cerr<<i<<endl;
19         int x=random(100000);
20         printf("%d\n",x);
21         for (int i=2;i<=x/2;i++){
22             int fa=rendom(1,min(i-1,10));
23             int val=random(10000)+1;
24             //int a=random(10),b=random(10),c=random(10);
25             printf("%d %d %d\n",fa,i,val);
26         }for (int i=x/2+1;i<=x;i++){
27             int fa=rendom(max(1,i-10),i-1);
28             int val=random(10000)+1;
29             //int a=random(10),b=random(10),c=random(10);
30             printf("%d %d %d\n",fa,i,val);
31         }int m=random(100000);
32         printf("%d\n",m);
33     //    set<int> s;
34         for (int i=1;i<=m;i++){
35             int a=rendom(1,x);
36             int b=rendom(1,x);
37             int c=rendom(1,x);
38             int d=rendom(1,x);
39             if(a>b)swap(a,b);
40             if(c>d)swap(c,d);
41             printf("%d %d %d %d\n",a,b,c,d);
42     //        while(s.size()<=4){
43     //            s.insert(random(1,1e5));
44     //        }
45     //        while(s.size()){
46     //            s.insert(random(1,1e5));
47     //        }
48         }
49 //    }
50     return 0;
51 }

以上数据生成只能生成读入的数据,并不能输出标算。

标算输出如下:

注:freopen内的数字要自己手动不断更新从1~10 。

code:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 int n,m,first[100010]={0},tot=0;
  5 int st[200010],top=0,dep[100010],pos[100010];
  6 int mnp[200010][21],p[200010];
  7 int seg[400010][2];
  8 ll dis[100010];
  9 struct edge
 10 {
 11     int v,next;
 12     ll d;
 13 }e[200010];
 14
 15 void insert(int a,int b,ll d)
 16 {
 17     e[++tot].v=b;
 18     e[tot].d=d;
 19     e[tot].next=first[a];
 20     first[a]=tot;
 21 }
 22
 23 void dfs(int v,int fa)
 24 {
 25     st[++top]=v;
 26     pos[v]=top;
 27
 28     for(int i=first[v];i;i=e[i].next)
 29         if (e[i].v!=fa)
 30         {
 31             dep[e[i].v]=dep[v]+1;
 32             dis[e[i].v]=dis[v]+e[i].d;
 33             dfs(e[i].v,v);
 34             st[++top]=v;
 35         }
 36 }
 37
 38 void rmq_init()
 39 {
 40     for(int i=1;i<=top;i++)
 41         mnp[i][0]=st[i];
 42     for(int i=1;i<=20;i++)
 43         for(int j=1;j+(1<<i)-1<=top;j++)
 44         {
 45             if (dep[mnp[j][i-1]]<dep[mnp[j+(1<<(i-1))][i-1]])
 46                 mnp[j][i]=mnp[j][i-1];
 47             else mnp[j][i]=mnp[j+(1<<(i-1))][i-1];
 48         }
 49     p[1]=0;
 50     for(int i=2;i<=top;i++)
 51     {
 52         if (1<<(p[i-1]+1)<i) p[i]=p[i-1]+1;
 53         else p[i]=p[i-1];
 54     }
 55 }
 56
 57 int rmq(int l,int r)
 58 {
 59     int x=p[r-l+1];
 60     if (dep[mnp[l][x]]<dep[mnp[r-(1<<x)+1][x]])
 61         return mnp[l][x];
 62     else return mnp[r-(1<<x)+1][x];
 63 }
 64
 65 ll dist(int a,int b)
 66 {
 67     int g=rmq(min(pos[a],pos[b]),max(pos[a],pos[b]));
 68     return dis[a]+dis[b]-2ll*dis[g];
 69 }
 70
 71 void merge(int a1,int a2,int b1,int b2,int &s1,int &s2)
 72 {
 73     ll ans=0;
 74     if (dist(a1,a2)>ans) ans=dist(a1,a2),s1=a1,s2=a2;
 75     if (dist(a1,b1)>ans) ans=dist(a1,b1),s1=a1,s2=b1;
 76     if (dist(a1,b2)>ans) ans=dist(a1,b2),s1=a1,s2=b2;
 77     if (dist(a2,b1)>ans) ans=dist(a2,b1),s1=a2,s2=b1;
 78     if (dist(a2,b2)>ans) ans=dist(a2,b2),s1=a2,s2=b2;
 79     if (dist(b1,b2)>ans) ans=dist(b1,b2),s1=b1,s2=b2;
 80 }
 81
 82 void pushup(int no)
 83 {
 84     merge(seg[no<<1][0],seg[no<<1][1],seg[no<<1|1][0],seg[no<<1|1][1],seg[no][0],seg[no][1]);
 85 }
 86
 87 void buildtree(int no,int l,int r)
 88 {
 89     if (l==r)
 90     {
 91         seg[no][0]=seg[no][1]=l;
 92         return;
 93     }
 94     int mid=(l+r)>>1;
 95     buildtree(no<<1,l,mid);
 96     buildtree(no<<1|1,mid+1,r);
 97     pushup(no);
 98 }
 99
100 void query(int no,int l,int r,int s,int t,int &ans1,int &ans2)
101 {
102     if (l>=s&&r<=t)
103     {
104         merge(ans1,ans2,seg[no][0],seg[no][1],ans1,ans2);
105         return;
106     }
107     int mid=(l+r)>>1;
108     if (s<=mid) query(no<<1,l,mid,s,t,ans1,ans2);
109     if (t>mid) query(no<<1|1,mid+1,r,s,t,ans1,ans2);
110 }
111
112 int main()
113 {
114     freopen("bbb1.in","r",stdin);
115     freopen("bbb1.out","w",stdout);
116     scanf("%d",&n);
117     for(int i=1;i<n;i++)
118     {
119         int x,y;
120         ll z;
121         scanf("%d%d%lld",&x,&y,&z);
122         insert(x,y,z),insert(y,x,z);
123     }
124     top=0;
125     dep[1]=dis[1]=0;
126     dfs(1,0);
127     rmq_init();
128
129     buildtree(1,1,n);
130     scanf("%d",&m);
131     for(int i=1;i<=m;i++)
132     {
133         int a,b,c,d;
134         scanf("%d%d%d%d",&a,&b,&c,&d);
135         int a1=a,a2=a,b1=c,b2=c;
136         ll ans=0;
137         query(1,1,n,a,b,a1,a2);
138         query(1,1,n,c,d,b1,b2);
139         ans=max(ans,dist(a1,b1));
140         ans=max(ans,dist(a1,b2));
141         ans=max(ans,dist(a2,b1));
142         ans=max(ans,dist(a2,b2));
143         printf("%lld\n",ans);
144     }
145     return 0;
146 }

在不断按键运行程序即可

这样一份10组数据就这样造好了。

原文地址:https://www.cnblogs.com/nlyzl/p/11832761.html

时间: 2024-08-01 11:04:01

浅谈【树】的数据生成的相关文章

浅谈树的重心

浅谈树的直径 定义: 树上一节点最大子树的节点数最小: 性质: 1.删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心: 2.树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等: 3.两个树通过一条边合并,新的重心在原树两个重心的路径上: 4.树删除或添加一个叶子节点,重心最多只移动一条边: 求解: 求解方法多种多样,分别用到不同的定义和性质: 1.定义求解: siz [ i ]表示 i 节点的子树大小 dp [ i ]表示以 i 为根节点的最大子树大小

浅谈动感歌词-歌词生成篇

1引言 在写这生成篇时,我还是在烦恼应该是先写歌词解析篇,还是先写歌词生成篇,后来我想一想,其实还是要先有歌词文件,才有解析嘛,当然,我们也可以通过现有的歌词(krc.trc和ksc等)直接跳过这一步,直接解析歌词即可. 2制作软件 这里介绍一下<小灰熊卡拉ok字幕制作软件>,我们可以通过一些专业的制作软件,来理清和弄懂歌词的制作原理.这里先上个截图: 由图和软件制作歌词的使用教程,我们可以知道如下信息: 1.歌词以行为单位制作,逐[字]制作 2.在制作歌词时,软件似乎已经把每一行歌词的[字]

浅谈树链剖分

今天刚学会树剖......(是不是觉得我很菜QwQ) 树剖的用处: 引子问题1: 给你一颗树,支持两种操作: 1.给x到y路径上的值加z 2.求出点x的值 简单,树上差分嘛,前几天刚学过啊. 引子问题2: 给你一颗树,支持两种操作: 1.给以x为根的子树加z 2.求出以x为根的子树的和. 简单,dfs序+线段树啊. 那么把两个问题结合起来呢?——树链剖分华丽丽登场!!! 树剖核心思想: 听说线段树挺好用的,区改区查只要log的复杂度,但是只能在线性结构上用,哎,真是太遗憾了. 听说有一种叫做df

浅谈树状数组

还是区间求和区间修改的问题,我们使用线段树解决以后发现编程复杂度比较大 在这里介绍一个简单的数据结构,树状数组. 树状数组的优势是编程复杂度小,常数小,时间复杂度也不错 树状数组的查询,修改,都是LOG(N)级别的 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6,c7=a7,c8=a1+a2+a3+a4+a5+a6+a7+a8,c9=a9,c10=a9+a10,c11=a11.......

浅谈 sql 中数据的约束

数据约束 --对用户操作表的数据进行约束 1.默认值 --当用户对使用默认值的字段不插入值的时候,就使用默认值 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null [例如:address  varchar(20)  default '广州天河'  --默认值] 2.非空 --限制字段必须赋值 1)非空字符必须赋值 2)非空字符不能赋null [例如:gender varchar(2)  not  null    --非空] 3.唯一 --对字段的值不能重复 1)唯一字段可

浅谈变量,数据变量与引用变量

Java是一种面向对象语言 Java程序中一切皆对象,也就是说运行中的Java程序其实是很多对象依照设计要求不断 创建 修改 联系其他对象 修改其他对象 完成使命后被垃圾收集器回收. 那么程序设计就要求定义对象的功能,设置对象之间的联系(接口),设计对象之间相互操作的顺序,根据操作结果的不同再进行更多不同的操作. 对象的定义指对对象的准确描述(对象有什么属性特点,具备什么能力-方法),定义对象的文件我们称之为类,所以类可以有属性和方法: (其实对象是非常非常非常抽象的,它的抽象体现在 1.范围广

浅谈WebService返回数据效率对比

原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html 一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使   用WebService服务提供. 二.创建WebService 创建WebService之后,我们就可以在文件里写返回数据的方法了. 三.返回数据的四种形式 笔者水平有限,只列出这四种数据的返回形式: (1)直

浅谈互联网企业数据中心网络设计

主要想解析下目前互联网公司数中心做为电子商务的基础承载面临的一些问题和挑战,以及目前我司在用网络设计供大家参考和指导,欢迎各位大大批评指正. 1.数据中心网络设计思考:互联网企业最大的特点在于公网.内网像两根平行线,中间的设备需要强大的横向扩展能力,所以采用的相应的VDC或vrf特性,将核心端口或端口组划至相应的VDC或VRF下 主要考虑端口密度.背板带宽.交换容量.特性.HA 无阻塞线速转发设计 高扩展性 端口密度 高转发缓存 高可用性 设计思路: 使用CSS/VSS/IRF技术将物理两台设备

[转] - 浅谈数据分析和数据建模

大数据应用有几个方面,一个是效率提升,帮助企业提升数据处理效率,降低数据存储成本.另外一个是对业务作出指导,例如精准营销,反欺诈,风险管理以及业务提升.过去企业都是通过线下渠道接触客户,客户数据不全,只能利用财务数据进行业务运营分析,缺少围绕客户的个人数据,数据分析应用的领域集中在企业内部经营和财务分析. 数字时代到来之后,企业经营的各个阶段都可以被记录下来,产品销售的各个环节也被记录下来,客户的消费行为和网上行为都被采集下来.企业拥有了多维度的数据,包括产品销售数据.客户消费数据.客户行为数据

浅谈树链剖分(C++、算法、树结构)

关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013/08/15/3259083.html 另一个是百度文库 http://wenku.baidu.com/link?url=DY8CAbwdjitIiv8XQsHmVPi--dQAqw5z6dc_6N1Plh4u5Nfc1aCADQm4oAvt4Sqe1mXSixezzK4lRxofQKMX9cNzJ