当前位置: 首页 > news >正文

【电力——tarjan割点,求连通块】

题目

分析

这是割点的板子 

代码

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

const int N = 1e4+10;
const int M = 3e4+10;

int h[N], e[M], ne[M], idx;
int dfn[N], low[N], tot;
int root, ans;

void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void tarjan(int u)
{
    dfn[u] = low[u] = ++tot;
    
    int cnt = 0;
    for(int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if(!dfn[j])
        {
            tarjan(j);
            low[u] = min(low[u], low[j]);
            if(low[j] >= dfn[u])
                cnt++;
        }
        else low[u] = min(low[u], dfn[j]);
    }
    
    if(u != root) cnt++;
    ans = max(ans, cnt);
}
int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m), n || m)
    {
        idx = tot = 0;
        memset(h, -1, sizeof h);
        memset(dfn, 0, sizeof dfn);
        for(int i = 1; i <= m; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            add(a, b), add(b, a);
        }
        
        ans = 0; //删掉结点的最大贡献
        int cnt = 0; //连通块数目
        for(root = 0; root < n; root++)
            if(!dfn[root])
                tarjan(root), cnt++;
                
        printf("%d\n", cnt + ans - 1);
    }
}

相关文章:

  • Leetcode132:分割回文串 II
  • 【领域】百度OCR识别
  • 请AI帮我们进行JAVA ORM 框架的选型, Hibernate, Mybatis, Bee,如何选择
  • 类和对象进一步了解c++
  • ​SMPP 协议在短信网关中的应用与迁移指南​附上文档地址(另外有个包内的方法,我使用的版本是又问题的,文章已经附上解决方式)
  • cellphonedb v5受配体多组比较气泡图(原创函数)
  • Ubuntu系统中测试硬盘速度
  • java作业
  • [转盘寿司]
  • ES批量查询
  • 网络分层 DNS CDN简单概念梳理
  • vcpkg 与 CMake 集成的步骤
  • 从零搭建微服务项目Pro(第1-3章——Quartz定时任务模块整合)
  • Perl 调用 DeepSeek API 脚本
  • 云原生监控篇——全链路可观测性与AIOps实战
  • 安装即是高级版!专业版软件,
  • Hadoop之01:HDFS分布式文件系统
  • Xshell及Xftp v8.0安装与使用-生信工具050
  • 【AI学习从零至壹】pytorch基础
  • Linux安装Apache2.4.54操作步骤
  • 重庆网站seo优化/企业网站注册
  • wordpress后台500错误/seo排名优化首页
  • 二级网站建设标准/网络推广策划方案
  • 政府扶持办厂项目/网站排名优化外包公司
  • 传媒公司主要做什么/优化网络培训
  • 怎么搭建一个视频网站/网址外链平台