tarjan割点算法代码实现

#include<iostream>
using namespace std;
int n,m,x,y;
int e[9][9];
int root=1;
int timex;//时间戳
int num[9],low[9],flag[9];//flag标记割点
int min(int a,int b){

	if(a<b){
		return a;
	}else{
		return b;
	}
}

void dfs(int cur,int father){
	int child=0;
	timex++;
	num[cur]=timex;
	low[cur]=timex;
	for(int i=0;i<n;i++){
		if(e[cur][i]==1&&num[i]==0){//是否联通,是否被访问过
			child++;
			dfs(i,cur);
			low[cur]=min(low[cur],low[i]);
			if(cur!=root&&low[i]>=num[cur]){
				flag[cur]=1;
			}else if(cur==root&&child>=2){
				flag[cur]=1;
			}
		}

		if(e[cur][i]==1&&num[i]==1){//联通,但被访问过
			if(i!=father){//i不是当前节点的父亲,就是说i是当前节点的祖先
			   low[cur]=min(low[cur],num[i]);
			}
		} 

	}
}
int main(){

	cin>>n>>m;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			e[i][j]=0;
		}
	}
	for(int j=0;j<m;j++){
		cin>>x>>y;
		e[x][y]=1;
		e[y][x]=1;
	}

	dfs(1,root);
	for(int i=0;i<n;i++){
		if(flag[i]==1){
			cout<<i<<" ";
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/heroliu/p/10803298.html

时间: 2024-11-12 02:20:58

tarjan割点算法代码实现的相关文章

笔记:LCA最近公共祖先 Tarjan(离线)算法

LCA最近公共祖先 Tarjan他贱(离线)算法的基本思路及其算法实现 本文是网络资料整理或部分转载或部分原创,参考文章如下: https://www.cnblogs.com/JVxie/p/4854719.html http://blog.csdn.net/ywcpig/article/details/52336496 https://baike.baidu.com/item/最近公共祖先/8918834?fr=aladdin 最近公共祖先简称LCA(Lowest Common Ancesto

图的割点算法、图的割边算法

割点算法 • 在一个无向连通图中,如果删除某个顶点后,图不再连通(即任意两点之间不能相互到达),我们称这样的顶点为割点(或者称割顶). 判断一个顶点是不是割点除了从定义,还可以从DFS(深度优先遍历)的角度出发.我们先通过DFS定义两个概念. 假设DFS中我们从顶点U访问到了顶点V(此时顶点V还未被访问过),那么我们称顶点U为顶点V的父顶点,V为U的孩子顶点.在顶点U之前被访问过的顶点,我们就称之为U的祖先顶点. 显然如果顶点U的所有孩子顶点可以不通过父顶点U而访问到U的祖先顶点,那么说明此时去

LCA(最近公共祖先)--tarjan离线算法 hdu 2586

HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11320    Accepted Submission(s): 4119 Problem Description There are n houses in the village and some bidirectional roads c

KMP算法代码实现

//普通的暴力求解法 int ViolentMatch(char* s, char* p)   {       int sLen = strlen(s);       int pLen = strlen(p);          int i = 0;       int j = 0;       while (i < sLen && j < pLen)       {           if (s[i] == p[j])           {               /

常用MD5算法代码

常用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 维基百科:MD5 MD5加密后是一个字节数组, 但我们一般是取其十六进制的字符串表示法,当然,十六进制数字符串是区分大小写,在 mysql数据库,Java,和JavaScript语言中,一般是使用小写的字符串来表示, 而在 Oracle数据库官方提供的包中,返回的是大写字符串,这算是一个坑,如果你想要执行多次 md5,可能需要转换为小

C++排序算法代码

C++的快排算法代码  #include<iostream> #include<algorithm> #include<iomanip> #include<time.h> #define N 5000 using namespace std; template <class T> void qsort(T *l,T *r) { T *i,*j,*k;   int t;   i=l;j=r-1;k=i+rand()%(r-l);   t=*k;  

割点算法模板(Cut-vertex)

下面是求割點的模板,還有cut_vertex_num[]數組(array)記錄了哪些是割點 Int cut_vertex_num[]; void dfs(int cur,int pa) { int child=0,flag=0,i; low[cur]=dfn[cur]=++depth; for(i=0;i<adj[cur].size();i++) { int next=adj[cur][i]; if(!dfn[next]) //若未访问过 { child++; dfs(next,cur); lo

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.