BZOJ 1098: [POI2007]办公楼biu 并查集优化bfs找反图联通块

本文介绍了一种解决特定图论问题的方法,即在一个无向图中寻找最大数量的联通块。通过对原始问题进行转化,利用反图和并查集算法进行有效求解,并提供了完整的实现代码。

时空隧道


分析:
如果数据范围改成n<=1000那就是一道水题了…
题目翻译过来就是一张无向图中没有边直接相连的两个点一定在一个联通块中,问最多有多少个联通块…所以我们暴力建一张反图用并查集求出联通块个数就好了…
但是那就难在了n<=100000…虽说n方过百万也不是没有过…但是那也是特殊题目特殊方法啊(其实就是数据水~)…
所以考虑正解…我们考虑如果两个点在反图中有边,那么这两个点在原图中一定没有边…所以我们枚举每一个点,从这个点出发bfs把没有访问过的点入队(这些点在反图中和枚举的点是同一个联通块),然后再从队列中取出这些点继续bfs找点…
这不还是n^2的吗…QAQ
我们考虑如果两个点在一个联通块中,那么这两个点中有一个点是没有存在的必要的…所以我们在找联通块的时候把找到的点去掉就好了…
怎么去??方法很多…可以维护一个链表…当然机智的方法是并查集(NicoNicoNicoNi~~)…


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
//by NeighThorn
using namespace std;
const int maxn=100000+5,maxm=2000000+5;
int n,m,fa[maxn],hd[maxn],to[maxm*2],nxt[maxm*2],cnt,vis[maxn],ans,num[maxn];
inline void add(int x,int y){
    to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
}
inline int find(int x){
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
inline void bfs(int root){
    queue<int> q;q.push(root),num[++ans]=1;
    while(!q.empty()){
        int top=q.front();q.pop();fa[top]=find(top+1);
        for(int i=hd[top];i!=-1;i=nxt[i])
            vis[to[i]]=top;
        for(int i=find(1);i<=n;i=find(i+1))
            if(vis[i]!=top)
                num[ans]++,fa[i]=find(i+1),q.push(i) ;
    }
}
signed main(void){
    memset(hd,-1,sizeof(hd));
    scanf("%d%d",&n,&m);cnt=0;
    for(int i=1,x,y;i<=m;i++)
        scanf("%d%d",&x,&y),add(x,y),add(y,x);
    for(int i=1;i<=n+1;i++)
        fa[i]=i;
    for(int i=1;i<=n;i=find(i+1))
        bfs(i);
    cout<<ans<<endl;sort(num+1,num+ans+1);
    for(int i=1;i<=ans;i++)
        printf("%d ",num[i]);
    puts("");
    return 0;
}

by >_< NeighThorn

内容概要:本文围绕【语音增强】领域中的组稀疏信号去噪问题展开研究,提出了一种结合非凸正则化与凸优化理论的去噪方法,旨在提升含噪语音信号的可懂度与质量。文章系统阐述了组稀疏信号模型的构建机制,引入非凸正则项以更精确地逼近理想稀疏性,克服传统凸正则化在稀疏表达上的局限性,并采用高效的凸优化算法保障模型求解的稳定性与收敛性。整个算法流程在Matlab平台上完整实现,涵盖语音信号预处理、稀疏系数求解、去噪重构等关键环节,并配套提供可复现的代码资源,便于研究人员进一步验证与拓展。该方法在保留数学可处理性的同时显著增强了去噪性能,尤其适用于低信噪比环境下的语音恢复任务。; 适合人群:具备一定信号与系统、数字信号处理理论基础,熟悉稀疏表示与最优化方法,且拥有Matlab编程能力的研究生、科研人员及从事语音增强、音频工程、通信系统等相关领域的工程技术人员。; 使用场景及目标:①应用于语音通信、智能助听设备、语音识别前端等对语音质量要求较高的实际系统中;②作为高校课程或科研项目中的教学案例,帮助深入理解稀疏表示、非凸优化与凸优化算法的融合机制;③为后续研究非凸正则化在图像去噪、生物医学信号处理等其他稀疏恢复问题中的性能优势提供理论依据与实现范例。; 阅读建议:建议读者结合所提供的Matlab代码逐模分析,重点理解非凸正则项的设计动机及其对稀疏性的增强作用,深入掌握优化求解过程中迭代算法的实现细节;同时可通过调整正则化参数、测试不同噪声类型(如白噪声、车间噪声)与强度的语音信号,系统评估算法的鲁棒性、收敛速度与去噪效果,从而全面把握该方法的优势与潜在局限。
内容概要:本文系统介绍了节点不连续伽辽金方法(NDG)在求解线性和非线性平流方程中的一维数值实现过程,并配套提供了完整的Matlab代码实现。该方法作为一种高精度、高分辨率的数值离散化技术,特别适用于对流主导的偏微分方程求解,在处理间断解和保持数值稳定性方面具有突出优势。文章详细阐述了NDG方法的核心理论基础,包括弱形式构造、局部基函数选取、数值通量处理、时间推进格式(如显式Runge-Kutta方法)以及边界条件的实施策略。通过多个典型算例(如线性对流、Burgers方程等)的仿真分析,充分验证了该方法在捕捉激波、避免非物理振荡及保持高阶精度方面的有效性。结合代码实践,读者可深入掌握NDG方法的算法设计与编程实现的关键环节。; 适合人群:具备偏微分方程数值解法、有限元方法或计算流体力学基础知识,熟悉Matlab编程语言,从事科学计算、工程仿真、应用数学或相关领域研究的研究生、科研人员及工程师。; 使用场景及目标:①用于高阶数值方法的教学演示与学习,加深对间断伽辽金方法的理解;②应用于流体力学、气象模拟、环境科学等领域中对强对流现象的精确数值模拟;③作为复杂物理系统仿真中对流项高精度离散化的核心技术支撑;④为科研工作者开发定制化求解器提供可复用的算法原型与代码参考。; 阅读建议:建议读者结合Matlab代码逐行调试与运行,对照理论推导理解每个模的功能实现,重点关注数值通量、质量矩阵和刚度矩阵的构造过程。同时推荐参阅相关经典文献以深化对NDG方法数学理论和收敛性分析的理解,从而更好地将该方法迁移应用于自身研究课题中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值