生成一个
n
个节点的树和
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <time.h>
#include <set>
using namespace std;
typedef long long ll;
const int MAX_N = 1000;
const int MAX_M = 1000010;
int father[MAX_M];
int find(int x)
{
return father[x] == x ? x : father[x] = find(father[x]);
}
int main()
{
//freopen("GenerateTree.in", "w", stdout);
srand((unsigned)time(NULL));
int n, tmp, u, v;
for (int i = 1; i < MAX_N; ++i) {
n = i * 10;
printf("%d\n", n);
set<pair<int, int > > s;
for (int j = 1; j <= n; ++j) { father[j] = j; }
for (int j = 1; j < n - 1; ++j) { // 保证每个节点编号都出现
while(1) {
tmp = rand() % n + 1;
if (tmp == j) continue;
if (s.find(make_pair(tmp, j)) != s.end()) continue; // 防止出现重边
if (s.find(make_pair(j, tmp)) != s.end()) continue;
u = find(j);
v = find(tmp);
if (tmp == n -1 && find(n - 1) == find(n)) continue; // 防止和最后一条边n-1~n出现环
if (tmp == n && find(n) == find(n - 1)) continue;
if (u != v) break; // 防止出现环
}
printf("%d %d\n", j, tmp);
s.insert(make_pair(j, tmp));
s.insert(make_pair(tmp, j));
father[u] = v;
}
printf("%d %d\n", n - 1, n);
}
return 0;
}