Alex_McAvoy

想要成为渔夫的猎手

树的数据生成器

为方便测试与树相关的算法而编写的树的随机数据生成器

树的结点为 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;
}
感谢您对我的支持,让我继续努力分享有用的技术与知识点!