求图的连通分量

求图的连通分量题目 输出无向连通图各个连通分量 输入描述 输入文件中包含多个测试数据 每个测试数据的格式为 第 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos systemctl_正在不使用中

    centos systemctl_正在不使用中CentOS7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替。1、原来的service命令与systemctl命令对比daemon命令systemctl命令说明service[服务]startsystemctlstart[unit…

    2022年9月17日
    2
  • URL过滤技术

    URL过滤技术

    2021年4月15日
    148
  • centos7怎么退出vi_centos7怎么退出vi

    centos7怎么退出vi_centos7怎么退出vi一、首先用vi命令打卡要编辑的文件:注意:vi命令的使用如下打开或新建文件,并将光标至于第一行首:[root@centos6/]#vi/etc/my.cnf打开文件,并将光标移至最后一行行首:[root@centos6/]#vi+/etc/my.cnf打开文件,并将光标置于第n行首:[root@centos6/]#vi+n/etc/my.cnf打开文件,并将光标置于第一个与pattern匹配的串处…

    2022年9月30日
    1
  • centos7搭建hadoop集群之rsync和xsync[通俗易懂]

    centos7搭建hadoop集群之rsync和xsync[通俗易懂]文章记录于各个服务器(或者虚拟机等)已经配置了ssh免密登录,可执行下面操作,未配置ssh免密登录,可参考:https://blog.csdn.net/yhblog/article/details/84029535此文章是基于centos7minimal版本的,纯净系统,所以还需要安装rsync工具(确保所有节点都必须安装rsync)否则报错:安装成功:启动rsync服务sys…

    2022年6月2日
    33
  • MySQL的锁机制和加锁原理

    MySQL的锁机制和加锁原理MySQL的锁机制和加锁原理文章目录MySQL的锁机制和加锁原理1.行锁2.表锁3.页锁4.乐观锁和悲观锁4.1悲观锁4.2乐观锁5.MySQL/InnoDB中的行锁和表锁问题5.1InnoDB锁的特性6.RecordLock、GapLock、Next-keyLock锁6.1.RecordLock6.2.GapLock6.2.​1什么叫间隙锁6.2.2为什么说gap锁是RR隔离级别…

    2022年6月5日
    37
  • 服务器不支持ssl怎么回事,客户端和服务器不支持一般 SSL 协议版本或加密套件 解决方法…

    服务器不支持ssl怎么回事,客户端和服务器不支持一般 SSL 协议版本或加密套件 解决方法…今天谷歌、火狐、QQ等相关浏览器打开网站,突然提示如下错误:此网站无法提供安全连接www.huichengff.com使用了不受支持的协议。协议不受支持客户端和服务器不支持一般SSL协议版本或加密套件用火狐浏览器打开网站却提示如下错误:连接到www.huichengff.com时发生错误。无法安全地与对等端通信:没有双方共用的加密算法。错误代码:SSL_ERROR_NO_CYPHER…

    2022年6月2日
    331

发表回复

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

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