树图随机生成器
1.树
#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
#define ll long long
using namespace std;
mt19937 rnd(time(0));
const int maxn=20;
int main(){
int n=rnd()%maxn+3,op=rnd()%3;
printf("%d\n",n);
if(!op) F(i,2,n) printf("%d %d\n",i,rnd()%(i-1)+1);
else if(op==1) F(i,2,n) printf("1 %d\n",i);
else if(op==2) F(i,2,n) printf("%d %d\n",i,i-1);
return 0;
}
2.图
#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
#define ll long long
using namespace std;
mt19937 rnd(time(0));
const int maxn=10;
int main(){
int n=rnd()%maxn+3,m=rnd()%(n*(n-1)/2-n+1)+1,op=rnd()%3;
printf("%d %d\n",n,m);
if(!op) F(i,2,n) printf("%d %d\n",i,rnd()%(i-1)+1);
else if(op==1) F(i,2,n) printf("1 %d\n",i);
else if(op==2) F(i,2,n) printf("%d %d\n",i,i-1);
F(i,1,m) printf("%d %d\n",rnd()%n+1,rnd()%n+1);
return 0;
}
3.DAG:
#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
const int N=105;
mt19937 rnd(time(0));
bool vis[N];
int a[N],u,v,cnt;
inline int go(int x){ return rnd()%x; }
set<pair<int,int> >s;
int main(){
int n=go(N)+3,m,op=go(2);
if(op) m=go((n-1)*n/2-n+1)+n-1;
else m=min(n+10,(n-1)*n/2);//控制稀疏与稠密
printf("%d %d\n",n,m);
F(i,1,n) a[i]=i;
shuffle(a+1,a+n+1,rnd);
cnt=n;
F(i,1,m){
if(!cnt){
u=go(n)+1,v=go(n)+1;
while(u==v || s.find(make_pair(min(u,v),max(u,v)))!=s.end()) u=go(n)+1,v=go(n)+1;
}//随便连
else{
u=go(n)+1; while(cnt!=n && !vis[u]) u=go(n)+1;
v=go(n)+1; while(vis[v] || u==v || s.find(make_pair(min(u,v),max(u,v)))!=s.end()) v=go(n)+1;
if(!vis[u]) vis[u]=1,--cnt;
if(!vis[v]) vis[v]=1,--cnt;
}//先保证联通
if(u>v) swap(u,v);
s.emplace(make_pair(u,v));
printf("%d %d\n",a[u],a[v]);
}
return 0;
}