浅谈树的数据生成

Posted nlyzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈树的数据生成相关的知识,希望对你有一定的参考价值。

 

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

 

本蒟蒻谢谢大家观看

 

 

 

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

 

数据生成。

 

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

 

题目传送门

 

普通树的生成:(随机生成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
",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
",fa,i,val);
26         }int m=random(100000);
27         printf("%d
",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
",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
",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
",fa,i,val);
26         }int m=random(100000);
27         printf("%d
",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
",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
",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
",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
",fa,i,val);
31         }int m=random(100000);
32         printf("%d
",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
",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
",ans);
144     }
145     return 0;
146 }

 

在不断按键运行程序即可

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

以上是关于浅谈树的数据生成的主要内容,如果未能解决你的问题,请参考以下文章

浅谈树链剖分

浅谈树剖---树链剖分简易入门教程

浅谈树剖---树链剖分简易入门教程

浅谈树链剖分

浅谈树链剖分

浅谈树链剖分