为方便测试与树相关的算法而编写的树的随机数据生成器
树的结点为 1~10 个,边权为 1~100,各点编号随机化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include <algorithm> #include<ctime> using namespace std; #define N 50
struct Edge { int x, y; int dis; } edge[N]; int n,edgeTot; int tot, x[N], y[N], dis[N]; int id[N], father[N]; int Find(int x) { return father[x] == x ? x : Find(father[x]); } int main() { srand(time(0)); n = rand() % 10 + 1; printf("%d\n", n); for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n; ++j) { x[++tot] = i; y[tot] = j; dis[tot] = rand() % 100 + 1; } } for (int i = 1; i <= tot; ++i){ id[i] = i; father[i] = i; } random_shuffle(id + 1, id + tot + 1); for (int i = 1; i <= tot; ++i) { int pos = id[i]; int fx = Find(x[pos]); int fy = Find(y[pos]); if (fx == fy) continue; father[fy] = fx; edge[++edgeTot].x = x[pos]; edge[edgeTot].y = y[pos]; edge[edgeTot].dis = dis[pos]; if (edgeTot == n - 1) break; } for ( int i = 1; i <= edgeTot; i++) printf("%d %d %d\n", edge[i].x, edge[i].y, edge[i].dis); system("pause"); return 0; }
|