美文网首页
生成一棵固定大小的随机结构的树(c++)

生成一棵固定大小的随机结构的树(c++)

作者: 江海小流 | 来源:发表于2019-10-05 15:24 被阅读0次

思路

生成随机的 prufer 编码,再将 prufer 编码还原成树。

实现

# include <bits/stdc++.h>
using namespace std;

# define Mem(x,y) memset(x,y,sizeof(x))

typedef pair<int, int> P;

const int N = 1e6 + 100;

int prufer[N], size;
void random_prufer(int size) {
    srand(time(NULL));
    for (int i = 0; i < size - 2; i++) {
        prufer[i] = rand() % size;
    }
}

vector<P> edges;
int prufer_num[N];
set<int> ac;
void gen_edges(int size) {
    Mem(prufer_num, 0);
    ac.clear();
    edges.clear();

    for (int i = 0; i < size - 2; i++) {
        prufer_num[prufer[i]] ++;
    }

    for (int i = 0; i < size; i++) {
        if (prufer_num[i] == 0) ac.insert(i);
    }

    for (int i = 0; i < size - 2; i++) {
        int u = prufer[i];
        int v = *ac.begin();
        ac.erase(ac.begin());
        prufer_num[u] --;
        if (prufer_num[u] == 0) {
            ac.insert(u);
        }
        edges.push_back(P(u, v));
    }

    int u = *ac.begin();
    int v = *ac.rbegin();
    edges.push_back(P(u, v));
}

vector<int> g[N];
int fa[N];
void dfs(int v, int f) {
    fa[v] = f;
    for (int i = 0; i < g[v].size(); i++) {
        if (g[v][i] != f) {
            dfs(g[v][i], v);
        }
    }
}

void build_tree(int size) {
    for (int i = 0; i < size; i++) {
        g[i].clear();
    }

    for (int i = 0; i < size - 1; i++) {
        g[edges[i].first].push_back(edges[i].second);
        g[edges[i].second].push_back(edges[i].first);
    }

    int root = 0;                   // change root at it.
    dfs(root, 0);
}

void solve(int n) {
    random_prufer(n);
    gen_edges(n);
    build_tree(n);

    /*
    fa[]: 0...n-1 's father, root's father is 0, 0 is the root initially.
    edges[]: the n-1 edges
    */

    for (int i = 1; i < n; i++) {
        printf("%d\n", fa[i]);
    }

    for (int i = 0; i < n - 1; i++) {
        printf("%d %d\n", edges[i].first, edges[i].second);
    }
}


int main(void) {
    freopen("ou.txt", "w", stdout);

    int n = 11;
    solve(n);         // n is the size of the tree.

    return 0;
}

相关文章

  • 生成一棵固定大小的随机结构的树(c++)

    思路 生成随机的 prufer 编码,再将 prufer 编码还原成树。 实现

  • RF和Feature Importance函数

    RF原理 随机森林中每颗树的生成: 1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练...

  • JSON数据转C++结构体

    JSON数据自动生成C++结构体 JSON数据自动生成C++结构体背景nlohmann/json基础Python自...

  • 算法实现

    生成一个固定高度的二叉树,每个父节点有随机的0~2个子节点。 先定义树的类: 生成二叉树的方法: 递归双边滤波磨皮...

  • 1-1 决策树的基本结构及三个终止条件

    1. 决策树的基本结构 决策树很简单,就是根据特征的不同取值生成的一棵树。因为有很多特征,所以这棵树会生成若干层的...

  • C++ 数组

    C++数组 C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但...

  • 2 - 卡通树

    简介 1 .生成一个带有随机顶点的球体的一棵树 2 . 3 .源码地址 4 .var tree = QuickTr...

  • OpenCV:图片操作基本知识(二)

    公众号:大邓带你玩python 1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的。 1...

  • shell案例解析

    批量生成随机字符文件名称生成固定模式包含随机字符的文件名称,首先获得随机字符,拼接字符串,通过touch命令创建文...

  • php使用md5生成随机字符串

    有时候我们常需要生成一些固定长度的随机字符串,比如uuid,随机字符串等 生成36位uuid 生成随机32位字符串...

网友评论

      本文标题:生成一棵固定大小的随机结构的树(c++)

      本文链接:https://www.haomeiwen.com/subject/gftpyctx.html