隨機一個樹的核心,做爲根節點,而後只向着核心的方向建邊。c++
#include<bits/stdc++.h> #include<time.h> using namespace std; int a[500001]; pair<int,int> pr[500001]; int cnt = 0; int rrand(int l, int r) {//生成一個在 [l, r] 內的隨機數 int t = (rand() % (1 << 10)) * (rand() % (1 << 10)); return t % (r - l + 1) + l; } int main() { srand(time(0) * 1000 + time(0)); int n; scanf("%d", &n);//若是須要直接隨機的話把這裏改爲 n = rand() 或 n = rrand(區間左端點,區間右端點) 就好 printf("%d\n", n); int d = rrand(1, n); for(int i = 1; i <= n; ++i) { a[i] = i; } random_shuffle(a + 1, a + n + 1);//STL庫函數,能夠隨機打亂數組中的元素 for(int i = d - 1; i >= 1; --i) { int to = rrand(i + 1,d); cnt++; if(rand() & 1) pr[cnt] = make_pair(a[i],a[to]); else pr[cnt] = make_pair(a[to],a[i]); } for(int i = d + 1; i <= n; ++i) { int to = rrand(d,i - 1); cnt++; if(rand() & 1) pr[cnt] = make_pair(a[i],a[to]); else pr[cnt] = make_pair(a[to],a[i]); } random_shuffle(pr + 1,pr + n); for(int i = 1; i <= n - 1; ++i) { printf("%d %d\n", pr[i].first, pr[i].second); } return 0; }