求图的连通分量

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


相关推荐

  • JavaScript 时间戳格式化日期

    JavaScript 时间戳格式化日期JavaScript时间戳格式化日期项目中从后台获取接口数据时常需要按自己的需求将时间戳转化为对应的日期格式。//时间戳格式化为日期functionformatDate(timestamp,fmt){//这里传入的timestamp应该是Number数值,如果是字符串,需要先转换为Number//vartimestamp=parseInt(timestamp)vardate=newDate(timestamp)if(/(y+)/.tes

    2025年7月15日
    3
  • 9.电阻线性电压转换电路[通俗易懂]

    9.电阻线性电压转换电路[通俗易懂]电阻线性电压转换电路在电子设计中,电阻值的测量是非常重要的。比如在薄膜压力传感器中需要对电阻值进行测量,利用PT100测温度的时候需要测量其电阻。1.电阻分压测量方法在测量电阻的时候通常都是转换为电压测量,串联一个已知电阻,测量两个电阻之间的电压,利用分压公式得到电阻值。显然这个电路中,输出电压为:式中,为串联分压的电阻,为参考电压。令为10K,为5V,利用MATLAB画出U-R曲线,如图:从曲线可以看出,U与R不成线性关系,计算复杂。并且R的测量精度在不同值

    2022年5月8日
    86
  • 慎用域名url转发功能_url转发域名可以带端口吗

    慎用域名url转发功能_url转发域名可以带端口吗许多域名注册商或虚拟主机商都提供一种免费的URL转发功能,让拥有一个主网站并同时拥有多个域名的用户实现多个域名指向同一个网站或网站子目录,但具体是通过什么机制实现的则大都讳忌莫深,往往只说“通过服务器的特殊技术设置”。同时,大多数服务商提供的URL转发还包括两种,不隐藏路径的URL转发与隐藏路径的URL转发,其中,不隐藏路径的URL转发指在跳转后浏览器地址栏显示真正的目标地址,而隐藏路径的URL转…

    2022年10月18日
    2
  • PyCharm for Anaconda

    PyCharm for AnacondaPyCharmforAnaconda新版本的特点智能Python帮助 PyCharm提供了智能代码完成、代码检查、动态错误突出显示和快速修复,以及自动化的代码重构和丰富的导航功能。 Web开发框架 PyCharm为现代web开发框架(如Django、Flask、Google应用程序引擎、Pyramid和web2py)提供了强大的特定于框架的支持。 科学工具(新版本的)…

    2022年8月29日
    6
  • jetty—jetty自动重启问题

    jetty自动重启问题

    2022年2月24日
    54
  • RxSwift如何避免回调地狱

    RxSwift如何避免回调地狱

    2022年4月3日
    53

发表回复

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

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