首页 > 其他分享 >图论割点模板

图论割点模板

时间:2024-04-01 22:23:11浏览次数:22  
标签:图论 int 割点 ++ num low dfn include 模板

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;


const int N = 109;
int low[N], num[N], dfn;
bool iscut[N];
vector<int>G[N];
//num只是记录跑到这个点的“时间”,不必修改
void dfs(int u, int fa)
{
	num[u] = low[u] = ++dfn;
	int child = 0;
	for (int i = 0; i < G[u].size(); i++)
	{
		int v = G[u][i];
		if (!num[v])
		{
			child++;
			dfs(v, u);
			//为什么不用fa?因为这只是“直系”!要考虑的不是祖先,不是并查集之类的问题,
			low[u] = min(low[u], low[v]);
			if (low[u] <= low[v] and u != 1)
				//为什么加上u!=1?因为u是1的情况已经在下面讨论了,防止只有1个孩子的1号节点也被算
				iscut[u] = 1;
		}
		else if (num[v] < num[u] and v != fa)
			//处理回退边,就是越级相连的点,为什么要加v!=fa?因为无向图初始化的时候两边都会进vector
			low[u] = min(low[u], num[v]);
	}
	if (u == 1 and child >= 2)
		iscut[1] = 1;
}
int main()
{
	int ans, n;
	while (scanf("%d", &n) != -1)
	{
		if (n == 0)break;
		memset(low, 0, sizeof(low));
		memset(num, 0, sizeof(num));
		dfn = 0;
		for (int i = 0; i <= n; i++)G[i].clear();
		int a, b;
		while (scanf("%d", &a) && a)
		{
			while (getchar() != '\n')
			{
				scanf("%d", &b);
				G[a].push_back(b);
				G[b].push_back(a);
			}
		}
		memset(iscut, 0, sizeof(iscut));
		ans = 0;
		dfs(1, 1);
		for (int i = 1; i <= n; i++)ans += iscut[i];
		cout << ans;
	}
	return 0;
}

标签:图论,int,割点,++,num,low,dfn,include,模板
From: https://www.cnblogs.com/zzzsacmblog/p/18109500

相关文章

  • flask模板介绍
    flask模板render_template加载html文件,默认文件路径在templates下fromflaskimportFlask,render_template,requestapp=Flask(__name__)@app.route('/',methods=['GET'])defindex():my_str='Hellobenben'my_int=request.args.get('......
  • 外贸网站模板:电子元件外贸响应式英文网站zblogphp模板主题(PC+手机站)
    外贸网站模板:电子元件外贸响应式英文网站zblogphp模板主题(PC+手机站)外贸网站模板:电子元件外贸响应式英文网站zblogphp模板主题(PC+手机站)主要是以文字内容为主导,将页面的设计杂乱的图片和元素进行最小化或者去除,从而使整个页面更加简洁、清晰,突出信息的呈现。下面介绍一下......
  • 写模板, 线性筛
    筛质数:1需要:bitset位标记,vector存储质数2流程:标记了就是质数,加到vector。用当前数遍历所有已知质数进行标记,直到质数跑完或者质数为当前数的因子。3注意事项:合数被标记的原理是因为每个合数都由最小质因子来标记,所以当质因子为i的因子时,直接break。4延申:根据线性筛可以找......
  • 程序员简历收费模板120套免费分享
    一、简历就是你一个人最开始的卖点,无论你多么的有才华,有可能;你没有施展的时候这些别人对你都是一无所知;①你能解决问题的能力,卖点并不是你认为自己所掌握的能力,很多人在个人简历中大量的罗列出自己具有怎样的能力。但是这些能力在实际的工作中并没有作用,也就不能称之为卖点。......
  • 搜索与图论(五)拓扑排序---以题为例
    给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序......
  • 突破编程_C++_C++14新特性(变量模板)
    1变量模板在C++14中的引入与扩展在C++14中,变量模板的引入与扩展为编程带来了许多便利,特别是在泛型编程方面。这一特性允许我们直接定义模板变量,而不需要将其包装在模板类或模板函数中,从而使得代码更加直观和简洁。首先,我们来详细了解一下C++14之前模板的使用限制。......
  • C++--STL函数模板
    一.函数模板我们可以定义一个函数模板(functiontemplate),而不是为每个类型都定义一个函数。一个函数模板就是一个蓝图,可用来生成针对特定类型的函数。例如用于比较两个数字的大小compare()函数的模板如下:template<typenameT>intcompare(constT&v1,constT&v2){......
  • Excel数据库模板导出
    有时候我们不仅需要将excel文件中的数据导入到数据库,同时我们还需要将数据库中的数据或者表字段导出,接下来我们就具体看看如何进行数据库模板导出~我记得需要导入easypoi的相关注解(如果没记错的话):<dependency><groupId>cn.afterturn</groupId><a......
  • 拓扑排序的模板
    拓扑排序的模板,csdn:https://blog.csdn.net/weixin_43872728/article/details/98981923#include<iostream>#include<vector>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>usingnamespacestd;intin[10......
  • 图论板子
    链式前向星的存储模板#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map>#inclu......