生成一个树和一个简单环的数据
代码:
#include <bits/stdc++.h>
#define random(x,y) (rand()%((y)-(x)+1)+(x))
void tree(){ //生成一个树的数据
int n=random(500,1000);//树的大小
printf("%d\n",n);
for(int i=2;i<=n;++i){
int x=random(1,i-1);
printf("%d %d\n",x,i);//先向随机的处理过的点连边
int op=random(1,10);//取随机数
if(op==1){//10%的概率会生成一条链
++i;
int sz=random(1,10);//链长度
for(;i<=n&&sz--;++i)
printf("%d %d\n",i-1,i);
}
}
}
void circles(){ // 生成简单环图的数据
//本来需要先记录边数再做输出, 这里为了方便没记录边数
//可以用while(~scanf)读取
int n=random(500,1000);
printf("%d\n",n);
int i=2;// 1为孤点, 方便处理
for(;i<=n;++i){
int sz=random(5,30);//链长度
if(i+sz-1>n)sz=n-i+1;//点数不足取最大
int t1=random(1,i-1);//随机选一个已处理的点
printf("%d %d\n",t1,i++);//链接i和随机选择的点
for(;i<=n&&sz--;++i)//生成链
printf("%d %d\n",i-1,i);
if(i>n)break;//点数耗尽
printf("%d %d\n",i-1,i);//将当前点也连到链上
//以当前点开始生成一个环
sz=random(20,30);
if(i+sz-1>n)sz=n-i+1;//点数不足取最大
printf("%d %d\n",i,i+sz-1);//连接 i~i+sz-1
++i; --sz;//开始连从i->i+sz-1的链
for(;i<=n&&sz--;++i)
printf("%d %d\n",i-1,i);
//至此在原有图上延伸出了一条链和一个环
}
}
int main(){
//输出一个只含简单环的图
freopen("circles.in","w",stdout);
circles();
fclose(stdout);
//输出一棵树
freopen("tree.in","w",stdout);
tree();
fclose(stdout);
return 0;
}