http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1119
如果将连通图G中的某个点及和这个点相关的边删除后,将使原图不再连通,那么这个点就称为图G的割点或是接合点。如果一个无向图没有割点,则这样的图被称为双连通图。
算法用到了一下两个数组。
dfn:这个点在dfs序列中的位置 low:经过这个点及这个点的所有儿子能追溯到的dfn最小点的dfn值~~ 这样我们发现,如果发现low(儿子)>=dfn(父亲),那么这个父亲就是一个割点。(他的儿子向下找没法重新找到自己的父亲~) 当然这还是不够的,我们发现对于我们搜索的第一个点来说,他的dfn值是1,永远不会有点的low值比他大,所以我们要特判下,如果说他的真正的儿子(就是dfs的时候找到的儿子,也就是环不算)的个数大于1的话,他就是一个割点。 zoj_1119
#include <cstring>
#include <cstdio>
#include<algorithm>
using namespace std;
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define FORD(i,h,l) for(int i=(h);i>=(l);--i)
#define N 1010
bool vis[N],g[N][N];
int low[N],dfn[N],subnets[N];
int n,tmpdfn,son;
void init_tarjan()
{
memset(vis,0,sizeof(vis));
memset(subnets,0,sizeof(subnets));
memset(g,0,sizeof(g));
tmpdfn=0;
son=0;
n=0;
}
void tarjan(int u)
{
vis[u]=1;
dfn[u]=low[u]=++tmpdfn;
for(int i=1;i<=n;++i)
{
if(g[u][i])
{
if(!vis[i])
{
if(u==1)
++son;//root
tarjan(i);
low[u]=min(low[u],low[i]);
if(u!=1&&low[i]>=dfn[u])
++subnets[u];
}
else
low[u]=min(low[u],dfn[i]);
}
}
}
/*void dfs(int u)
{
//FOR(v,1,n)
for(int v=1;v<=n;++v)
if(g[u][v])
{
if(!vis[v])
{
if(u==1)
++son;
vis[v]=1;
low[v]=dfn[v]=++tmpdfn;
dfs(v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
{
if(u!=1) subnets[u]++;
//else son++;
}
}
else low[u]=min(low[u],dfn[v]);
}
} */
void init(void)
{
low[1]=dfn[1]=1;
tmpdfn=1;
n=son=0;
memset(vis,0,sizeof(vis));
vis[1]=1;
memset(subnets,0,sizeof(subnets));
memset(g,0,sizeof(g));
}
int main(void)
{
int u,v;
int Case=1;
freopen("e:\\zoj\\zoj_1119.txt","r",stdin);
while(scanf("%d",&u)==1 && u)
{
scanf("%d",&v);
init_tarjan();
if(u>n) n=u;
if(v>n) n=v;
g[u][v]=g[v][u]=1;
while(scanf("%d",&u)==1 && u)
{
scanf("%d",&v);
if(u>n) n=u;
if(v>n) n=v;
g[u][v]=g[v][u]=1;
}
//dfs(1);
tarjan(1);
if(Case>1) puts("");
printf("Network #%d\n",Case++);
if(son>1) subnets[1]=son-1;
bool find=0;
FOR(i,1,n) if(subnets[i])
{
if(!find) find=1;
printf(" SPF node %d leaves %d subnets\n",i,subnets[i]+1);
}
if(!find) puts(" No SPF nodes");
}
return 0;
}
发表评论
-
BFS与双向BFS---zoj_1505
2011-10-09 17:14 1676http://acm.zju.edu.c ... -
静态treap+线段树---zoj_2112
2011-09-29 23:06 1734http://acm.zju.edu ... -
NIM博弈游戏,SG函数---zoj_3084,zoj_2083
2011-09-23 23:00 1340Nim游戏是两个人进行的游戏有如下规则: ... -
多重背包--zoj_2156
2011-09-14 11:10 893首先介绍经典的三种背包问题,0-1背包,完全 ... -
模式串匹配---KMP
2011-08-31 20:49 1307朴素的的模式串匹配算法通常要在向前移动文本指针 ... -
八数码问题(A*&&双向BFS)---zoj_1217
2011-08-30 22:13 1702题目地址:http://acm.zju.edu.cn/onli ... -
ac自动机以及它上面的DFA
2011-08-08 23:04 2527AC自动机(Aho-Corasick)主要用 ... -
二分图最大匹配(匈牙利算法)--zoj1516,1525,2223
2011-07-20 22:36 1209二分图G(E,V)将点集合V分成两个部分L,R ... -
网络最大流(EK)---zoj_1734
2011-07-19 16:34 2179网络最大流是图论中的一个典型问题,为了精确的定 ... -
trie和前缀检查---zoj_2876
2011-07-13 23:03 890trie树是一种多叉树,广泛用于字典检索。如 ... -
位图bitmap
2011-07-13 21:08 948bitmap是一种广泛使用的数据结构,主要用在 ... -
LAC和RMQ的转化---zoj_3195
2011-07-12 22:35 1103我擦。。纠结了好久啊,从SF到TLE,先总结2 ... -
LAC的tarjan(离线)算法---zoj_1141
2011-07-08 17:52 1690LCA就不解释了,这里主要再次复习一下LC ... -
笛卡尔树以及treap---zoj_2243
2011-07-07 15:52 2886zoj_2243笛卡 ... -
线段染色,矩形切割,离散化---zoj_2301,zoj_1128
2011-06-24 22:32 1409染色问题:在一维坐标轴上(最右端为M),有N ... -
线段树---zoj_1610
2011-06-22 21:06 786线段树是一种二叉树的拓展,在线段树每个节点中 ... -
快速排序(qsort)
2011-06-16 17:03 799快速排序是一种高效的非稳定排序,它的基本思路 ... -
斐波那契散列
2011-06-16 16:38 3108斐波那契散列法其实是一种特殊的乘法散列,先来看乘法 ... -
强连通分支(scc)---tarjan
2011-06-15 16:17 1311本文大量 ... -
单源最短路径SPFA---zoj3146
2011-06-09 15:25 974针对Bellman-Ford算法效率比较低 ...
相关推荐
Tarjan-data_structures_and_network_algorithms.pdfTarjan-data_structures_and_network_algorithms.pdfTarjan-data_structures_and_network_algorithms.pdfTarjan-data_structures_and_network_algorithms....
POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
在IT领域,特别是图论和数据结构中,"tarjan LCA"是一种高效的算法,用于求解树(或有向无环图DAG)中两个节点的最近公共祖先(Lowest Common Ancestor)。这里,"contest_tarjan_LCA_源码"很可能是某个编程竞赛中的...
Tarjan算法是由Robert Endre Tarjan设计的一种高效算法,主要用于解决图的深度优先搜索(DFS)和强连通分量等问题。在解决LCA问题时,Tarjan算法通常会结合后序遍历或线性预处理等技术,以O(n)的时间复杂度完成...
Tarjan-Languer快速算法,用于在流程图中查找支配者 原料药 var pipeline = require ( 'tarjan' ) . create ( 'dominance' ) ; // Initialize pipeline // ... // ... var tarjan = require ( 'tarjan' ) . create ...
ACM算法模板的PDF版本,方便大家打印与使用,所有模板均经过测试。...图论--割点--Tarjan模板 图论--割边--Tarjan模板 图论--边双连通V-DCC缩点 图论--双连通E-DCC缩点模板 图论--强连通
Tarjan算法是一种求解图的连通性问题的方法,特别用于识别割点(cut vertex)和桥(bridge)。这两个概念对于理解图的结构至关重要。 1. 割点:在一个图中,如果移除某个顶点后导致原本连通的两个子图变得不连通,...
Tarjan算法可以用来识别无向图中的所有双连通分量和割点。 Tarjan算法的特点在于其空间和时间效率,它们是关于图的顶点数和边数线性关系。这意味着算法的性能与图的大小成正比,而与图的具体结构无关,这使得算法...
Tarjan等计算机科学家共同研究的一项成果——关于选择问题的时间界限。文章分为两部分:第一部分为《时间界限的选择》;第二部分为《期望时间界限的选择》,后者由Robert W. Floyd和Ronald L. Rivest共同完成。 ...
Tarjan算法的基本概念在于,它能够用于求解有向图的强连通分量,即将一个有向图中的强连通分量压缩成单个节点,从而将其转化为有向无环图(DAG)。强连通分量是指在有向图中,任何两个节点之间都可以相互到达的子图...
Tarjan算法是图论中的一种常见算法,用于寻找有向图中的割点和割边。割边是指删除该边后,图将被分割成两个或多个连通分量的边。 Tarjan算法可以快速地找到所有的割边。 割边的定义与割点的定义类似。若去掉某边,...
这个压缩包文件“图论- 图的连通性- Tarjan 缩点.rar”包含了对这一专题的深入探讨,特别是通过一个PDF文档“图论- 图的连通性- Tarjan 缩点.pdf”。 首先,我们要理解什么是图的连通性。在图论中,一个无向图被...
本资源“图论- 图的连通性- Tarjan 求双连通分量.rar”着重讨论了图的连通性以及一种用于求解双连通分量的著名算法——Tarjan算法。 首先,我们理解一下图的连通性。一个无向图是连通的,如果任意两个顶点之间都...
### Tarjan算法详解 #### 一、背景及定义 在计算机科学领域,特别是...此外,Tarjan 算法与求无向图的双连通分量(割点、桥)的 Tarjan 算法之间也存在着紧密的联系,这对于深入理解 Tarjan 系列算法具有重要意义。
Tarjan算法是一种用于查找有向图中强连通分量的高效算法,它基于深度优先搜索(DFS)的思想。在有向图中,如果两个顶点之间存在双向的有向路径,即从一个顶点可以到达另一个顶点,同时另一个顶点也能反向到达第一个...
Tarjan算法是一种求解有向图中强连通分量的有效算法,由Robert Tarjan于1972年提出。该算法基于深度优先搜索(DFS)的基本思想,同时引入了低链接(low link)和访问序列(discovery time)的概念,用于识别强连通...
使用 Tarjan 算法,可以有效地计算图的传递闭包。(给定一个图G , G的传递闭包 是一个包含相同顶点并包含从v 到w的边当且仅当在G中存在从v到w的路径的图。) 传递闭包在 tarjan.tc 中实现: 展开组层次结构 给定...