题目大意:也是给你一个无向连通图,让你求出该无向图的割点,并求出如果去掉这个割点,该无向图会变成几个连通分量。
算法思路:赤裸裸的tarjan求割点算法,但cnt数组记录的是去掉该点,连通图的连通分量的变化量,因此,如果数组在该点的值不为1,那么说明这个点为割点,但要注意,分成的连通分量数为cnt数组在该点的值+1。但特别要注意的一点,如果根节点是割点的话,那么说明根的度>=2,则这个度就是分成的连通分量数,不必再+1。
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; #define MAXN 1005 int a[MAXN][MAXN],low[MAXN],dfn[MAXN],cnt[MAXN]; bool visited[MAXN],over,flag; int num[MAXN]; int l,r,times,n,sum,sym,sym2; map<int,bool>maps; void tarjan(int u) { dfn[u]=low[u]=times++; visited[u]=true; for(int i=1;i<sym2;i++) { int v=num[i]; if(a[u][v]) { if(visited[v]) low[u]=min(low[u],dfn[v]); else { tarjan(v); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]&&u!=1) cnt[u]++; else if(u==1) sum++; } } } } int main() { sym=1; while(true) { maps.clear(); sym2=1; n=-1;sum=0; flag=false; memset(cnt,0,sizeof(cnt)); memset(a,0,sizeof(a)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(visited,false,sizeof(visited)); memset(num,0,sizeof(num)); times=0; scanf("%d",&l); if(l==0&&over) break; while(true) { if(l==0) { over=true; break; } over=false; scanf("%d",&r); if(l>n) n=l; if(r>n) n=r; if(maps.find(l)==maps.end()) { maps[l]=true; num[sym2++]=l; } if(maps.find(r)==maps.end()) { maps[r]=true; num[sym2++]=r; } a[l][r]=a[r][l]=1; scanf("%d",&l); } //for(int i=1;i<=n;i++) //{ tarjan(num[1]); // } printf("Network #%d\n",sym++); if(sum>=2) { flag=true; printf(" SPF node %d leaves %d subnets\n",num[1],sum); } for(int i=2;i<=n;i++) { if(cnt[num[i]]) { flag=true; printf(" SPF node %d leaves %d subnets\n",num[i],cnt[num[i]]+1); } } if(!flag) printf(" No SPF nodes\n"); printf("\n"); } }
相关推荐
【标题】"POJ1523 SPF【割点】"是编程竞赛中的一道题目,涉及图论中的一个重要概念——割点。该题目要求参赛者编写程序来判断一个无向图是否存在割点,并进行相应的处理。割点,也称为关键顶点,是指在无向图中,...
【标题】"POJ1523 - SPF 测试数据"是源于 Greater New York 2000 年编程竞赛中的问题H,这个题目在ACM(国际大学生程序设计竞赛)领域内颇具代表性。SPF全称为Shortest Path First,通常指的是寻找图中最短路径的一...
这道题的目的是求如去除某个点,能把图分成多少个子图,求这样子图的最大数。...其实就是求割点,然后看每个割点能把图分成多少个子图,当然原图不一定是连通的。 割点的求法各个书籍上都有,其实就是用DFS进行遍历。
poj 1523 SPF.md
割点、桥和连通分量是图论中的重要概念,它们在算法设计和图的分析中起到关键作用。在图中,一个割点(Cut vertex)是指删除该点后会使得原来的连通图变为不连通的点,即它的存在维系了某些部分之间的连接。而桥...
【标题】"80道POJ解题报告"所涉及的知识点主要集中在ACM(国际大学生程序设计竞赛)和POJ(编程Online Judge系统)上。POJ是北京大学主办的一个在线编程竞赛平台,广泛用于训练和提升程序员的算法设计与实现能力。80...
* 图的割边和割点:例如 poj3352。 * 最小割模型、网络流规约:例如 poj3308。 3. 数据结构: * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * ...
5. **割点和桥**:识别图中的关键节点和边(poj3352)。 ### 十二、进阶数据结构 1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, poj2886, poj2750)。 2. **平衡树**:如AVL树、红黑树等...
标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...
【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...
标题“POJ3414-Pots”是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。这个题目主要考察的是算法设计和实现能力,通常涉及计算机科学中的数据结构和算法知识。 解题报告是参赛者在...
17. POJ——2707 求一元二次方程的根:涉及到基础的代数知识,如使用求根公式解决一元二次方程。 18. POJ——2714 求平均年龄:可能需要处理年龄数据并计算平均值,涉及到数据处理和统计计算。 19. POJ——2715 谁...
【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...
* 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...
3. **图算法的深化**:如差分约束系统、最小费用最大流、双连通分量、强连通分支及其缩点、图的割边和割点、最小割模型等。poj1201、poj2983等涉及这些高级图算法。 4. **高级数据结构**:如线段树、平衡树(Treap、...
最小生成树是图论中的一个重要概念,它要求找到一个无向加权图的边子集,使得这些边连接了图中的所有顶点,并且这些边的总权重尽可能小。常见的求解最小生成树的算法有Prim算法和Kruskal算法。 1. **Prim算法**:从...
包括求多边形面积、点在多边形内等判定,如poj1408和poj1584。 #### 凸包 寻找凸多边形的边界,用于图形分析和碰撞检测,如poj2187和poj1113。 ### 中级阶段的扩展 在初级阶段的基础上,中级阶段涵盖了更多复杂的...
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...
- 图的深度优先遍历和广度优先遍历:用于探索图的所有节点,如`poj1860, poj3259`。 - 最短路径算法:如Dijkstra算法和Bellman-Ford算法,用于找到两点间的最短路径,如`poj1062, poj2253`。 - 最小生成树算法:...