📜  使用不交集并集的Tree的测试用例生成器

📅  最后修改于: 2021-04-17 08:31:26             🧑  作者: Mango

在本文中,我们将生成测试用例,以使给定的设置边形成一棵树。以下是树的两个条件:

  • 它的边应比顶点数少一个。
  • 里面应该没有周期。

方法:想法是运行一个循环并在每次随机生成的边上添加一个边,对于添加每个边,我们将检查它是否正在形成循环。通过不交集联合,我们可以确保存在或不存在循环。如果添加任何边形成循环,则忽略当前边并生成新的边集。否则,将使用随机生成的权重打印边缘。

下面是上述方法的实现:

C++
// C++ implementation to generate
// test-case for the Tree
  
#include 
using namespace std;
  
typedef long long int ll;
#define fast ios_base::sync_with_stdio(false);
#define MOD 1000000007
  
// Maximum Number Of Nodes
#define MAXNODE 10;
  
// Maximum Number Of testCases
#define MAXT 10;
  
// Maximum weight
#define MAXWEIGHT 100;
  
// Function for the path
// compression technique
ll find(ll parent[], ll x)
{
    // If parent found
    if (parent[x] == x)
        return x;
  
    // Find parent recursively
    parent[x] = find(parent, parent[x]);
  
    // Return the parent node of x
    return parent[x];
}
  
// Function to compute the union
// by rank
void merge(ll parent[], ll size[],
           ll x, ll y)
{
    ll r1 = find(parent, x);
    ll r2 = find(parent, y);
  
    if (size[r1] < size[r2]) {
        parent[r1] = r2;
        size[r2] += size[r1];
    }
    else {
        parent[r2] = r1;
        size[r1] += size[r2];
    }
}
  
// Function to generate the
// test-cases for the tree
void generate()
{
    ll t;
    t = 1 + rand() % MAXT;
  
    // Number of testcases
    cout << t << "\n";
    while (t--) {
  
        // for 2<=Number of Nodes<=MAXNODE
  
        // Randomly generate number of edges
        ll n = 2 + rand() % MAXNODE;
        ll i;
        cout << n << "\n";
        ll parent[n + 1];
        ll size[n + 1];
  
        // Initialise parent and
        // size arrays
        for (i = 1; i <= n; i++) {
            parent[i] = i;
            size[i] = 1;
        }
  
        vector > Edges;
        vector weights;
  
        // Now We have add N-1 edges
        for (i = 1; i <= n - 1; i++) {
            ll x = 1 + rand() % n;
            ll y = 1 + rand() % n;
  
            // Find edges till it does not
            // forms a cycle
            while (find(parent, x)
                   == find(parent, y)) {
  
                x = 1 + rand() % n;
                y = 1 + rand() % n;
            }
  
            // Merge the nodes in tree
            merge(parent, size, x, y);
  
            // Store the current edge and weight
            Edges.push_back(make_pair(x, y));
            ll w = 1 + rand() % MAXWEIGHT;
            weights.push_back(w);
        }
  
        // Print the set of edges
        // with weight
        for (i = 0; i < Edges.size(); i++) {
  
            cout << Edges[i].first << " "
                 << Edges[i].second;
            cout << " " << weights[i];
            cout << "\n";
        }
    }
}
  
// Driver Code
int main()
{
    // Uncomment the below line to store
    // the test data in a file
    // freopen ("output.txt", "w", stdout);
  
    // For random values every time
    srand(time(NULL));
  
    fast;
  
    generate();
}


输出:
1
10
4 2 67
8 3 64
6 5 31
7 6 77
8 2 64
9 2 44
5 9 10
1 6 71
10 7 32

时间复杂度: O(N * logN)
辅助空间: O(1)