求图的连通分量

求图的连通分量题目 输出无向连通图各个连通分量 输入描述 输入文件中包含多个测试数据 每个测试数据的格式为 第 1 行为两个整数 n 和 m 分别表示顶点个数和边数 然后有 m 行 每行表示一条边 为这条边的两个顶点的序号 顶点序号从 1 开始计起 假定无向图是连通的 可能存在割点 也可能没有割点 n m 0 时表示输入结束 输出描述 对每个测试数据 以 uv 的形式依次输出各连通分量中的每条边 每

题目:输出无向连通图各个连通分量。



输入描述。输入文件中包含多个测试数据,每个测试数据的格式为:第1行为两个整数n和m,分别表示顶点个数和边数,然后有m行,每行表示一条边,为这条边的两个顶点的序号,顶点序号从1开始计起。假定无向图是连通的(可能存在割点,也可能没有割点)。n = m = 0时表示输入结束。


输出描述。对每个测试数据,以“u v”的形式依次输出各连通分量中的每条边,每个连通分量的数据占一行,用空格分隔每条边。各测试数据的输出之间用空行分隔开。


#include <iostream> #include <cstring> using namespace std; const int MAXN = 25; const int MAXM = 50; int MIN(int a, int b) { return a > b ? b : a; } struct edge { int u, v; void output() { cout<<u<<"-"<<v; } bool Compare( edge &t ) { return (u == t.u && v == t.v) || (u == t.v && v == t.u); } }; edge edges[MAXM];//Êý×éÄ£Äâ±ßÕ» int top; int Edge[MAXN][MAXN]; int visited[MAXN]; int n, m; int tmpdfn; int dfn[MAXN]; int low[MAXN]; void DFS( int u ) { for(int v = 1; v <= n; v++) { if(Edge[u][v] == 1) { edge t; t.u = u, t.v = v; edges[++top] = t; Edge[u][v] = Edge[v][u] = 2; if(!visited[v]) { visited[v] = 1; dfn[v] = low[v] = ++tmpdfn; DFS( v ); low[u] = MIN(low[u], low[v]); if(low[v] >= dfn[u]) { bool firstedge = true; while(1) { if(top < 0) break; if(firstedge) firstedge = false; else cout<<" "; edge t1; t1 = edges[top]; t1.output(); edges[top].u = 0, edges[top--].v = 0; if(t1.Compare(t)) break; } cout<<endl; } } else low[u] = MIN(low[u], dfn[v]); } } } int main() { int i, u, v; int kcase = 1; while(1) { cin>>n>>m; if(m == 0 && n == 0) break; memset(Edge, 0, sizeof(Edge)); for(i = 1; i <= m; ++i) { cin>>u>>v; Edge[u][v] = Edge[v][u] = 1; } if(kcase++ > 1) cout<<endl; low[1] = dfn[1] = 1; tmpdfn = 1; memset(visited, 0, sizeof(visited)); visited[1] = 1; memset(edges, 0, sizeof(edges)); top = -1; DFS( 1 ); } return 0; } 

输入输出样例:

输入:
7 9 
1 2 
1 3 
1 6 
1 7 
2 3 
2 4 
2 5 
4 5 
6 7 
4 4 
1 2 
2 3 
3 4 
4 1 
















0 0 



输出:

5-2 4-5 2-4 
3-1 2-3 1-2 
7-1 6-7 1-6 
4-1 3-4 2-3 1-2 





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233311.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月30日 下午1:01
下一篇 2025年7月30日 下午1:22


相关推荐

  • intellij idea运行配置_idea2017配置jdk

    intellij idea运行配置_idea2017配置jdkIntelliJidea2017.2配置Tomcat8.5前期准备IDEA、JDK、Tomcat什么的先装好,环境配置好,本文中没有这些配置博客图片为主请注意看仔细第一步当然先得建一个web项目1、file-&gt;new-&gt;project-Next-&gt;Finish-项目建好了接下来就是配置了-工具栏点击上图图标或【F4】或项目右键【OpenModuleS…

    2022年8月31日
    12
  • 四叉树的C++实现

    四叉树的C++实现数据结构抽象数据类型定义如下 ADTQuadTrees 数据对象 D D 是具有相同性质的具有二维结构的数据元素的集合 本实验为坐标数据 数据关系 R 若 D 为空集 则称为空树 若 D 仅含有一个数据元素 则 R 为空集 否则 R H H 是如下二元关系 1 在 D 中存在唯一的元素 root 它在关系 H 下无父节点 2 D 中任意元素 d 将其子节点划分为四个象限 将

    2026年3月17日
    2
  • 时间轮在Kafka的实践「建议收藏」

    时间轮在Kafka的实践「建议收藏」桔妹导读:时间轮是一个应用场景很广的组件,在很多高性能中间件中都有它的身影,如Netty、Quartz、Akka,当然也包括Kafka,本文主要介绍时间轮在kafka的应用和实战,从核心…

    2026年4月15日
    7
  • 索引知识系列二:联合索引、索引覆盖和索引下推详解

    索引知识系列二:联合索引、索引覆盖和索引下推详解一 前言上一节我们讲解了聚集索引和非聚集索引的区别 索引知识系列一 聚集索引与非索引详解 我们知道非聚集索引在查询过程中有回表的过程 这就造成了效率的下降 那如何不用回表或者减少回表以提高查询速度呢 这就是本章要讲的内容 二 联合索引联合索引 也叫组合索引 复合索引 多列索引 是指对表上的多个列进行索引 联合索引的创建方法跟单个索引的创建方法一样 不同之处仅在于有多个索引列 开讲之前我们先弄一张学生表 表数据如下 下面我们给出一个需求 查询表中以字母 L 开头的姓名及年龄 1 常规的写法

    2026年3月26日
    2
  • 排序-冒泡排序

    排序-冒泡排序排序算法之【冒泡排序】在写代码之前我们需要对冒泡排序有一个逻辑上的理解:即什么是冒泡排序呢?冒泡排序是排序算法的其中一种,该排序的逻辑理解起来较为容易,理解上可以有两种方式,一种中正向的思维,一种是逆向的思维,什么意思呢?所谓的正向思维就是从前往后,从左往右,从上到下。那么逆向思维呢就正好与之相反。下面来说一正向思维下的冒泡排序:…

    2022年6月17日
    31
  • 一次完整的渗透测试流程

    一次完整的渗透测试流程目录渗透测试信息收集漏洞探测漏洞利用内网转发内网渗透痕迹清除撰写渗透测试保告渗透测试渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告,对网站进行漏洞修补,以防止黑客的入侵!渗透测试的前提是我们得经过用户的授权,才可以对网站进行渗透。如果我…

    2022年5月2日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号