树图随机生成器

树图随机生成器

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;
}
posted @ 2023-11-12 10:51  superl61  阅读(7)  评论(0编辑  收藏  举报