`
plussai
  • 浏览: 90692 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

图的割点tarjan---zoj_1119

 
阅读更多

       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; 
}  


 

 

    

     

    

分享到:
评论

相关推荐

    Tarjan-data_structures_and_network_algorithms.pdf

    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-边双连通分量-缩点】

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    contest_tarjan_LCA_源码

    在IT领域,特别是图论和数据结构中,"tarjan LCA"是一种高效的算法,用于求解树(或有向无环图DAG)中两个节点的最近公共祖先(Lowest Common Ancestor)。这里,"contest_tarjan_LCA_源码"很可能是某个编程竞赛中的...

    LCA.zip_lca Tarjan pascal_lca pascal_tarjan lca pascal

    Tarjan算法是由Robert Endre Tarjan设计的一种高效算法,主要用于解决图的深度优先搜索(DFS)和强连通分量等问题。在解决LCA问题时,Tarjan算法通常会结合后序遍历或线性预处理等技术,以O(n)的时间复杂度完成...

    tarjan:Tarjan-Languer快速算法,用于在流程图中查找支配者

    Tarjan-Languer快速算法,用于在流程图中查找支配者 原料药 var pipeline = require ( 'tarjan' ) . create ( 'dominance' ) ; // Initialize pipeline // ... // ... var tarjan = require ( 'tarjan' ) . create ...

    ACM图论模板合集.pdf

    ACM算法模板的PDF版本,方便大家打印与使用,所有模板均经过测试。...图论--割点--Tarjan模板 图论--割边--Tarjan模板 图论--边双连通V-DCC缩点 图论--双连通E-DCC缩点模板 图论--强连通

    图论- 图的连通性- Tarjan 求割点与桥.rar

    Tarjan算法是一种求解图的连通性问题的方法,特别用于识别割点(cut vertex)和桥(bridge)。这两个概念对于理解图的结构至关重要。 1. 割点:在一个图中,如果移除某个顶点后导致原本连通的两个子图变得不连通,...

    Tarjan 算法论文 DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS.pdf

    Tarjan算法可以用来识别无向图中的所有双连通分量和割点。 Tarjan算法的特点在于其空间和时间效率,它们是关于图的顶点数和边数线性关系。这意味着算法的性能与图的大小成正比,而与图的具体结构无关,这使得算法...

    Blum、Floyd、Pratt、Rivest、Tarjan__Time bounds for selection.pdf

    Tarjan等计算机科学家共同研究的一项成果——关于选择问题的时间界限。文章分为两部分:第一部分为《时间界限的选择》;第二部分为《期望时间界限的选择》,后者由Robert W. Floyd和Ronald L. Rivest共同完成。 ...

    Tarjan及2-SAT讲课PPT

    Tarjan算法的基本概念在于,它能够用于求解有向图的强连通分量,即将一个有向图中的强连通分量压缩成单个节点,从而将其转化为有向无环图(DAG)。强连通分量是指在有向图中,任何两个节点之间都可以相互到达的子图...

    tarjan求割边

    Tarjan算法是图论中的一种常见算法,用于寻找有向图中的割点和割边。割边是指删除该边后,图将被分割成两个或多个连通分量的边。 Tarjan算法可以快速地找到所有的割边。 割边的定义与割点的定义类似。若去掉某边,...

    图论- 图的连通性- Tarjan 缩点.rar

    这个压缩包文件“图论- 图的连通性- Tarjan 缩点.rar”包含了对这一专题的深入探讨,特别是通过一个PDF文档“图论- 图的连通性- Tarjan 缩点.pdf”。 首先,我们要理解什么是图的连通性。在图论中,一个无向图被...

    图论- 图的连通性- Tarjan 求双连通分量.rar

    本资源“图论- 图的连通性- Tarjan 求双连通分量.rar”着重讨论了图的连通性以及一种用于求解双连通分量的著名算法——Tarjan算法。 首先,我们理解一下图的连通性。一个无向图是连通的,如果任意两个顶点之间都...

    tarjan算法

    ### Tarjan算法详解 #### 一、背景及定义 在计算机科学领域,特别是...此外,Tarjan 算法与求无向图的双连通分量(割点、桥)的 Tarjan 算法之间也存在着紧密的联系,这对于深入理解 Tarjan 系列算法具有重要意义。

    Tarjan算法精讲

    Tarjan算法是一种用于查找有向图中强连通分量的高效算法,它基于深度优先搜索(DFS)的思想。在有向图中,如果两个顶点之间存在双向的有向路径,即从一个顶点可以到达另一个顶点,同时另一个顶点也能反向到达第一个...

    图论- 图的连通性- Tarjan 求强连通分量.rar

    Tarjan算法是一种求解有向图中强连通分量的有效算法,由Robert Tarjan于1972年提出。该算法基于深度优先搜索(DFS)的基本思想,同时引入了低链接(low link)和访问序列(discovery time)的概念,用于识别强连通...

    Tarjan 的强连通分量算法的Python实现

    使用 Tarjan 算法,可以有效地计算图的传递闭包。(给定一个图G , G的传递闭包 是一个包含相同顶点并包含从v 到w的边当且仅当在G中存在从v到w的路径的图。) 传递闭包在 tarjan.tc 中实现: 展开组层次结构 给定...

Global site tag (gtag.js) - Google Analytics