题目大意:有n个房间,这些房间都有给定的路,现在要求任意两个房间能否相同(假设a与b相连通,那么只要满足a与b能够连通或者b与a能够连通即可)。,如果任意的两点能够连通输出Yes,否则输出No.
算法思路:明显的求强连通分量,再缩点,再对缩点后的图判断连通性(这里采用拓扑排序判断连通性,如果有2个及以上的点入度为0的点出现的话,说明缩点后的图是不连通的)。
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<queue> using namespace std; int a[1005][1005],m,n,t,dfn[1005],low[1005],a2[1005][1005]; bool visited[1005],ins[1005],over,over2; int l,r,cnt,times,group[1005]; int outdeer[1005],indeer[1005]; stack<int>stk; void tarjan(int u) { stk.push(u); ins[u]=true; dfn[u]=low[u]=times++; for(int i=1; i<=n; i++) { if(a[u][i]) { if(!dfn[i]) { tarjan(i); low[u]=min(low[u],low[i]); } else if(ins[i]) { low[u]=min(low[u],dfn[i]); } } } int k; if(low[u]>=dfn[u]) { do { k=stk.top(); stk.pop(); ins[k]=false; group[k]=cnt; } while(u!=k); cnt++; } } bool topusort() { queue<int>que; int sum2=0; for(int i=1;i<cnt;i++) { if(indeer[i]==0) { visited[i]=true; sum2++; que.push(i); } } if(sum2>=2) return false; else if(sum2==1) { while(!que.empty()) { sum2=0; int kk=que.front(); que.pop(); for(int i=1;i<cnt;i++) { if(a2[kk][i]) { indeer[i]--; outdeer[kk]--; a2[kk][i]=0; } } for(int i=1;i<cnt;i++) { if(!visited[i]&&indeer[i]==0) { sum2++; visited[i]=true; que.push(i); } } if(sum2>=2) return false; } } return true; } int main() { scanf("%d",&t); while(t--) { over=false; over2=true; memset(a,0,sizeof(a)); memset(visited,false,sizeof(visited)); memset(ins,false,sizeof(ins)); memset(group,0,sizeof(group)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(outdeer,0,sizeof(outdeer)); memset(indeer,0,sizeof(indeer)); memset(a2,0,sizeof(a2)); scanf("%d%d",&n,&m); for(int i=1; i<=m; i++) { scanf("%d%d",&l,&r); a[l][r]=1; } times=1; cnt=1; for(int i=1; i<=n; i++) { if(!dfn[i]) tarjan(i); } if(!stk.empty()) { while(!stk.empty()) { int f=stk.top(); stk.pop(); group[f]=cnt; } cnt++; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(a[i][j]&&group[i]!=group[j]) { outdeer[group[i]]++; indeer[group[j]]++; a2[group[i]][group[j]]=1; } } } // int sum1=0,sum2=0; if(topusort()) printf("Yes\n"); else printf("No\n"); } return 0; }
相关推荐
POJ2186-Popular Cows ...【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
对于LCA问题,有不少解法,这儿提供了tarjan算法,这是一种离线算法,读入所有输入然后一并处理,并且利用并查集的思想,从根节点开始DFS,对每一个DFS的节点,先把他的父亲节点指向本身,没访问完一个子节点,然后...
求解强连通分量可以使用Tarjan算法或者Kosaraju算法。这两种算法都是基于深度优先搜索的,但执行顺序不同。Tarjan算法在搜索过程中同时计算割点和SCC,而Kosaraju算法则先对原图进行一次DFS得到拓扑排序,再对反向图...
POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
POJ2942-Knights of the ...【Tarjan算法】 解题报告+AC代码 http://hi.csdn.net/!s/F3L8HO ================================== 我的POJ所有解题报告:http://blog.csdn.net/lyy289065406/article/details/6642573
【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...
POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 基本算法是指最基础的算法思想,如枚举、贪心、递归和分治法、递推、构造法、...
在编程竞赛领域,POJ(Programming Online Judge)是一个广受欢迎的在线编程平台,它提供了许多题目供参赛者解决,以提升编程和算法能力。本文主要关注的是“POJ中级图算法”的一系列题目及其解题报告和AC(Accepted...
POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...
在解决强连通子图问题时,可以使用Tarjan算法,该算法可以在O(n+m)时间内找到所有的强连通子图。Tarjan算法的基本思想是使用DFS搜索图,然后根据搜索结果来判断强连通子图。 Tarjan算法的步骤如下: 1. 对图进行...
在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...
根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...
【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...
【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...
4. **强连通分量**:识别图中的强连通分量(poj2186)。 5. **割点和桥**:识别图中的关键节点和边(poj3352)。 ### 十二、进阶数据结构 1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, ...
POJ各题算法分类和题目推荐.pdf
- **知识点**:强连通分量算法,如Kosaraju算法或Tarjan算法,用于找出图中的强连通分量。 #### 1251 Jungle Roads - MST - **知识点**:最小生成树(MST),一种用于构造连接图中所有顶点且总权重最小的树的算法...
3. 多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交):例如 poj1408、poj1584。 4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为...
标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...