渗透实验 - 并查集

2023-10-27

渗透实验


给定黑格数量
黑格随机分布,生成一个矩阵,黑格子表示不通,白格表示通
循环很多次,求在当前黑格数量下,从上到下矩阵通的概率


Eg

1 0 1 1 0 1
1 0 0 0 1 1
0 1 1 0 1 0
1 0 1 0 1 0

[0 1] - [1 1] - [1 2] - [1 3] - [2 3] - [3 3] -> 通


思路
在首行前和末行后添加一个起始点和终止点
从起始点开始,若有白格与之相连,则将其加入一个集合(并查集操作)
遍历白格,将相连的白格放入一个集合

最后看终止点和起始点是否在一个集合

#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdlib>
using namespace std;

const int N = 1000;

class unionFind{
public:
    unionFind(int size);
    ~unionFind();
    void union_node(int p, int q);
    int find(int p);
    bool connected(int p, int q);
    int count();
    
private:
    int num;
    int *id;
    int *rootSize;
};


unionFind::unionFind(int size){
    num = size;
    id = new int[size];
    rootSize = new int[size];
    for (int i = 0; i < size; i ++){
        id[i] = i;
    }
    for (int i = 0; i < size; i ++){
        rootSize[i] = 1;
    }
}

unionFind::~unionFind(){
    delete[] id;
    num = 0;
}

int unionFind::count(){
    return num;
}

bool unionFind::connected(int p, int q){
    return find(p) == find(q);
}

int unionFind::find(int p){
    if (p != id[p]) p = find(id[p]);
    return p;
}

void unionFind::union_node(int p, int q){
    int pRoot = find(p);
    int qRoot = find(q);
    if (qRoot == pRoot) return;
    if (rootSize[pRoot] < rootSize[qRoot]){
        id[pRoot] = qRoot;
        rootSize[qRoot] += rootSize[pRoot];
    }
    else{
        id[qRoot] = pRoot;
        rootSize[pRoot] += rootSize[qRoot];
    }
    num --;
}


int net[N][N];
bool st[N][N];
double pass, times;
double fi;
//遍历上下左右四个格子
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};

int main(){
    cin >> times;
    cin >> fi;
    
    int cnt = 0;
    for (int i = 0; i < N; i ++)
        for (int j = 0; j < N; j ++){
            net[i][j] = ++ cnt;
        }
    
    void srand(unsigned int seed);
    
        for (int t = 0; t < times; t ++){
            memset(st, false, sizeof st);
            for (int i = 0; i < fi * N * N; ){
                
                int x = rand() % N;
                int y = rand() % N;
                //cout << x << ' ' << y << endl;
                
                if (!st[x][y]) i ++;
                st[x][y] = true;
            }
            //创建并查集
            unionFind uF(N * N + 10);
            int start = N * N + 1;
            int end = N * N + 2;
            
            //在最上方和最下方创建起始点和终止点
            //通过判断起始点和终止点是否连通来判断是否渗透
            for (int i = 0; i < N; i ++){
                uF.union_node(start, net[0][i]);
                uF.union_node(end, net[N - 1][i]);
            }
            
            //创建连通片
            for (int i = 0; i < N; i ++)
                for (int j = 0; j < N; j ++){
                    //如果当前块为通
                    if (st[i][j]){
                        //遍历四个方向的方块
                        for (int k = 0; k < 4; k ++){
                            int x = i + dx[k], y = j + dy[k];
                            //如果方块合法,且为通
                            if (x >= 0 && x < N && y >= 0 && y < N && st[x][y]){
                                //如果两方块没有连通,则连通两方块
                                if (!uF.connected(net[x][y], net[i][j])){
                                    uF.union_node(net[x][y], net[i][j]);
                                }
                            }
                        }
                    }
                }
            
            //如果首尾节点连通
            if (uF.connected(start, end)){
                pass ++;
            }
        }
    
    cout << pass / times << endl;
    
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

渗透实验 - 并查集 的相关文章

随机推荐

  • 【无奈】Invalid byte 1 of 1-byte UTF-8 sequence解决方案

    今天在eclipse中编写pom xml文件时 注释中的中文被eclipse识别到错误 Invalid byte 1 of 1 byte UTF 8 sequence 曾多次遇到该问题 问题的根源是 The cause of this is
  • Vue路由hash模式下锚点滚动实现

    1 Vue路由在hash模式下 已被占用 无法使用浏览器的锚点功能 使用js实现锚点滚动功能 使用js实现锚点滚动功能 字符串需要是 id 锚点格式 数字的话标识要滚动的位置 param String Number selector exp
  • qt中自定义关闭按钮的时候绑定关闭事件

    qt中自定义了关闭按钮 如何简单的只用绑定信号跟槽就直接调用事件呢 1 首先在界面中放置一个按钮 重命名为CloseBtn 然后接下来就只需要在构造函数中加上如下的这句 connect ui gt CloseBtn SIGNAL click
  • DFS时,出现内存超限 Memory Limit Exceeded

    DFS时 出现内存超限 Memory Limit Exceeded 很大可能由于dfs死循环 比如 vis 数组一定优先赋值再dfs
  • 最小二乘曲线拟合——C语言算法实现一

    最小二乘曲线拟合 给定一组数据 我们要对这组数据进行曲线拟合 假定要拟合的曲线方程为 y a0 a1 x 1 a2 x 2 a3 x 3 an x n x y 0 995119 7 620000 2 001185 2 460000 2 99
  • Java算法之 n个整数中找出连续m个数加和是最大

    为什么80 的码农都做不了架构师 gt gt gt 分析 m个连续的整数加和是最大 那么最简单的实现方式就是 从下标为0查找m个元素 依次n个数组成的容器进行遍历 每次遍历判断当前最大的m个数之和 遍历结束后返回 public class
  • Linux系统下修改mysql数据库密码

    修改mysql数据库的方法有很多种 这个方法适用于忘记root用户密码或者刚安装mysql要进入mysql时发现系统报错及觉得默认密码太复杂想修改密码的 1 修改 etc my cnf 文件 在 mysql 后面任意一个地方添加以下内容 s
  • 常见问题-打不开宝塔面板

    解决方案 打不开宝塔面板 换个Chrome浏览器打开就可以了
  • jsp或html中给选中的a标签改变颜色和背景色(用源生js)

    我们直接看代码 我是循环遍历的a标签 给每个a标签一个class属性 然后在js中进行设置 这里的if比较是比较目前页面的a标签的值和我们点击传递的serlvet是否是同一个 如果是就改变颜色 我打印一下 在终端给看一下 好的 如果还有什么
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    SPSS 十九 SPSS之时间序列模型 图文 数据集 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列 正如人们常说 人生的出场顺序很重要 时间序列中隐藏着一些过去与未来的关系 时间序列分析试图通过研究过去来预测未来 时
  • js中请求数据的$post和$ajax区别(同步和异步问题)

    post和 Ajax都为页面上向后台发送请求 请求数据1 post 因为post默认为异步请求 可是有时候我们会发现 本来要求请求马上出现 可是异步会导致后面突然再执行 这样就出很多问题 2 Ajax 最原始的Ajax 可以控制同步或者异步
  • 1.3.1 手写数字识别之数据处理

    文章目录 概述 一 加载类库 二 读入数据并划分数据集 扩展阅读 为什么针对固定数据集的模型总在不断精进呢 三 训练样本乱序 生成批次数据 四 校验数据有效性 机器校验 人工校验 五 封装数据读取与处理函数 六 异步数据读取 七 扩展阅读
  • Python调用GPT3.5接口的最新方法

    GPT3 5接口调用方法主要包括openai安装 api requestor py替换 接口调用 示例程序说明四个部分 1 openai安装 Python openai库可直接通过pip install openai安装 如果已经安装ope
  • 【力扣】第302场周赛记录

    第302场周赛记录 6120 数组能形成多少数对 6164 数位和相等数对的最大和 6121 裁剪数字后查询第 K 小的数字 6122 使数组可以被整除的最少删除次数 6120 数组能形成多少数对 链接 数组能形成多少数对 描述 给你一个下
  • 深度学习常用激活函数

    神经网络构架过程中常用的激活函数表达式 函数图像和优缺点 激活函数决定输入信号是否或多大程度上应该通过节点 或神经元 传递到下一层 众所周知 神经网络的运算是线性的 引入非线性的激活函数 可以提高神经网络的拟合能力 下面讲解释一些常见的激活
  • spring源码中,委托模式的个人小感受

    文章目录 委托模式代码 代码感受 spring 源码中的应用 委托模式代码 注 不属于 23 种设计模式之一 是面向对象设计模式中常用的一种模式 public interface Cook void cook public class 川菜
  • 重新思考语义分割范式:SETR

    点击上方 CVer 选择加 星标 置顶 重磅干货 第一时间送达 本文作者 湃森 来源 知乎 已授权 https zhuanlan zhihu com p 348418189 一 论文信息 标题 Rethinking Semantic Seg
  • 热修复框架研究之Robust原理

    热修复框架研究之Robust原理 2017 03 28 15 23 出处 清屏网 人气 127 评论 0 热修复框架研究之Robust原理 作者 Houskii 这是群里重邮的子沛同学的投稿哦 Robust是美团点评团队在2017年3月开源
  • 【SQL注入】数字型注入 & 字符型注入

    目录 一 简介 概述 示例 数据库中区别 二 数字型注入 简介 判断 三 字符型注入 需闭合 简介 判断 一 简介 概述 一般会对数据的类型会有一个限制 不管怎么去区分 常用的数据类型有数值和字符型 通常SQL 注入漏洞分类 按照数据类型
  • 渗透实验 - 并查集

    渗透实验 给定黑格数量 黑格随机分布 生成一个矩阵 黑格子表示不通 白格表示通 循环很多次 求在当前黑格数量下 从上到下矩阵通的概率 Eg 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0