数据生成器
决定要做数据生成器大集合
树生成器
prufer编码做生成树
http://blog.youkuaiyun.com/nikelong0/article/details/50853122
mengbi_er友情赞助了一个树的数据生成器
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
int read()
{
char ch=getchar();int f=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') {f=f*10+(ch^48);ch=getchar();}
return f;
}
int rando()
{
return (rand()<<15)|rand();
}
int num[50005],fa[50005],tim[50005];
int main()
{
srand(time(NULL));
int n,k;
cin>>n;
cout<<endl;
for(int i=1;i<=n;i++)
num[i]=i;
for(int i=2;i<=n;i++)
tim[i]=i;
for(int i=1;i<=500000;i++)
{
swap(num[rando()%n+1],num[rando()%n+1]);
swap(tim[rando()%(n-1)+2],tim[rando()%(n-1)+2]);
}
/*fa[2]=1;
fa[3]=1;
for(int i=4;i<=n;i++)
{
if(i&1)
{
fa[i]=i-3;
}
else
fa[i]=i-2;
}*///只有左节点有儿子的二叉树
/*for(int i=2;i<=n;i++)
{
fa[i]=i/2;
}*///完全二叉树
/*for(int i=2;i<=n;i++)
{
fa[i]=i-1;
}*///链
/*for(int i=2;i<=n;i++)
{
fa[i]=rando()%(i-1)+1;
}*///随机树
/*for(int i=2;i<=n;i++)
{
fa[i]=1;
}*///菊花
/*for(int i=2;i<=40000;i++)
{
fa[i]=1;
}
for(int i=40001;i<=n;i++)
{
fa[i]=rando()%(i-1)+1;
}*///乱搞什么的
for(int i=2;i<=n;i++)
{
if(rand()&1)
{
printf("%d %d\n",num[fa[tim[i]]],num[tim[i]]);
}
else
{
printf("%d %d\n",num[tim[i]],num[fa[tim[i]]]);
}
}
}
环套树生成器
当年Oakley学长给的环套树生成器
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=50005;
const int MOD=4000;
int c[N];
bool used[N];
int main()
{
srand(time(0));
freopen("data.in","w",stdout);
int n=100,k=8;
int tot=0,siz=0;
printf("%d %d\n",n,k);
while(tot+siz<=n/2)
{
tot+=siz;
int now=0;
for(int i=1;i<=siz;i++)
{
int x=rand()%n+1;
while(used[x]) x=rand()%n+1;
if(!used[x]) c[++now]=x,used[x]=true;
}
c[siz+1]=c[1];
for(int i=1;i<=siz;i++) printf("%d %d\n",c[i],c[i+1]);
siz=rand()%(n/4)+2;
}
for(int i=1;i<=n;i++)
if(!used[i])
{
int x=i;
while(x==i) x=rand()%n+1;
printf("%d %d\n",i,x);
}
}