搜索与图论:树与图


树与图的深度优先遍历—树的重心

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式
第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式
输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围
1 ≤ n ≤ 105

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例:

4
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010, M = N * 2;
bool state[N];
int n;
int id;
int ans = N;
int h[N]; // 头节点 
int e[M]; // 节点 
int ne[M]; // 下一个节点 
void add(int a, int b)
{
	e[id] = b, ne[id] = h[a], h[a] = id ++ ;		
}
int dfs(int u)
{
	state[u] = true;
	int size = 0, sum = 0;
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i];
		if (state[j]) continue;
		int s = dfs(j);
		size = max(size, s);
		sum += s;	
	}  
	size = max(size, n - sum - 1);
	ans = min(ans, size);
	return sum + 1;
}
int main()
{
	cin >> n;
	memset(h, -1, sizeof h);
	for(int i = 0; i < n - 1; i ++ ) {
		int a, b;
		cin >> a >> b;
		add(a, b);
		add(b, a);
	}
	dfs(1);
	cout << ans;
	return 0;
} 

树与图的广度优先遍历—图中点的层次

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。

所有边的长度都是 1,点的编号为 1∼n。

请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。

输入格式
第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 a 和 b,表示存在一条从 a 走到 b 的长度为 1 的边。

输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。

数据范围
1 ≤ n,m ≤ 105

输入样例:

4 5
1 2
2 3
3 4
1 3
1 4

输出样例:

1
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 10, M = N * 2;
int n, m; 
int h[N], e[M], ne[N], idx;
int d[N];
void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int bfs()
{
	memset(d, -1, sizeof d);
	d[1] = 0;
	queue<int> q;
	q.push(1);
	while (q.size())
	{
		int t = q.front();
		q.pop();
		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (d[j] == -1)
			{
				d[j] = d[t] + 1;
				q.push(j);
			}
		}
	}
	return d[n];
}
int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for (int i = 1; i <= m; i ++ ) 
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
	}
	cout << bfs() << endl;
	return 0;	
} 

拓扑排序—有向图的拓扑序列

给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。

请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。

若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。

输入格式
第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 x 和 y,表示存在一条从点 x 到点 y 的有向边 (x,y)。

输出格式
共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。

否则输出 −1。

数据范围
1 ≤ n,m ≤ 105

输入样例:

3 3
1 2
2 3
1 3

输出样例:

1 2 3

本题思路:有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列

#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10, M = N * 2;
int n, m;
int h[N], e[M], ne[M], idx;
int q[N]; // 路径 
int d[N]; // 入度 
void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool bfs()
{
	int hh = 0, tt = -1;
	for (int i = 1; i <= n; i ++ )
		if (!d[i])
			q[ ++ tt ] = i;
	while (hh <= tt) 
	{
		int t = q[hh ++ ];
		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			d[j] -- ; // 删除t到j的边 
			if (d[j] == 0)
				q[ ++ tt ] = j;
		}
	}
	return tt == n - 1;
}
int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for (int i = 0; i < m; i ++ )
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
		d[b] ++ ;
	}
	if (bfs()) 
	{
		for (int i = 0; i < n; i ++ )
			cout << q[i] << ' ';
		puts("");
	}	
	else puts("-1");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
欧拉与相关专题 出版时间:2012年版 内容简介   《现代数学译丛(21):欧拉与相关专题》是迄今为止唯一的一本全面阐述欧拉理论的主要研究成果和研究方法及其与其他图论问题之间的联系的专著。本书包含两卷共十章。第一卷从欧拉的哥尼斯堡七桥问题开始,由浅入深地介绍了欧拉问题的起源,给出的基本概念和预备知识,然后相继地介绍了无向、有向以及混合中欧拉迹的结构性定理,欧拉迹的若干推广,各种类型的欧拉迹,欧拉迹的变换。在第二卷中,详尽地介绍了著名的中国邮递员问题,欧拉迹的计数问题,最后讨论了与欧拉问题相关的算法和计算复杂性。每章后面配有习题,帮助读者理解和掌握本章的主要内容。《现代数学译丛(21):欧拉与相关专题》适合从事图论研究的研究生和科研工作者使用,也是其他数学和计算机科学研究人员很好的参考书。 目录 第一卷 第1章 引言 第2章 欧拉理论的三个支柱 第3章 基本概念和预备知识 3.1 混合与它们的基本要素 3.2 与混合有向的子 3.3 导出子 3.4 路径、迹、路、圈、;连通度 3.5 相容性,K*V的循环序和对应的欧拉迹 3.6 匹配、1-因子、2-因子、1-因子分解、2-因子分解、二部 3.7 的曲面嵌入、同构 3.8 平面的着色 3.9 哈密顿圈 3.10 关联矩阵和邻接矩阵、流和张力 3.11 算法及其复杂性 3.12 注记 第4章 特征定理和推论 4.1 4.2 有向 4.3 混合 4.4 习题 第5章 再论欧拉迹及其推广展望 5.1 迹分解,路、圈分解 5.2 奇偶性结果 5.3 双迹 5.4 交叉边界:的分拆 5.5 习题 第6章 欧拉迹的各种类型 6.1 回避特定转移的欧拉迹 6.1.1 有向中户(0)相容欧拉迹 6.1.2 双欧拉有向中的反欧拉迹和的双欧拉定向 6.1.3 有向中的do-偏好欧拉迹 6.2 两两相容欧拉迹 6.2.1 有向中的两两相容欧拉迹 6.3 平面欧拉中的斗迹 6.3.1 平面欧拉中的a-迹和平面3-正则中的哈密顿圈之间的对偶性 6.3.2 欧拉中的a-迹和哈密顿圈 6.3.3 如何找出a-迹:一些复杂性讨论和算法的建议 6.3.4 关于非交叉欧拉迹和a-迹的注记以及另一问题 6.4 习题 第7章 欧拉迹的变换 7.1 中任意欧拉迹的变换 7.2 特殊的欧拉迹的变换 7.2.1 特殊类型的欧拉迹和k1-变换的应用 7.3 有向中的欧拉迹的变换 7.4 最终注解及一些未解决的问题 7.5 习题 参考文献 第二卷 第8章 各种类型的闭覆盖途径 8.1 双迹 8.2 中的值-真途径和整流 8.3 中国邮递员问题 8.3.1 关于上的中国邮递员问题 8.3.2 有向邮递员问题 8.3.3 混合邮递员问题 8.3.4 带风向的邮递员问题和最后注记 8.4 习题 第9章 欧拉迹及其数目 9.1 有向和(混合)的奇偶性的结果 9.1.1 矩阵代数的一个应用 9.2 计数初涉 9.2.1 矩阵定理 9.2.2 有向的欧拉迹计数 9.2.3 关于欧拉定向的数目 9.2.4 拜斯特定理的应用和推广 9.2.5 其他说明 9.3 习题 第10章 欧拉迹和圈分解的算法及迷宫搜索算法 10.1 欧拉迹的算法 10.2 圈分解算法 10.3 迷宫 10.4 习题 参考文献 对第一卷的更正和补录 人名译名表 《欧拉与相关专题》是迄今为止唯一的一本全面阐述欧拉理论的主要研究成果和研究方法及其与其他图论问题之间的联系的专著。《欧拉与相关专题》包含两卷共十章。第一卷从欧拉的哥尼斯堡七桥问题开始,由浅入深地介绍了欧拉问题的起源,给出的基本概念和预备知识,然后相继地介绍了无向、有向以及混合中欧拉迹的结构性定理,欧拉迹的若干推广,各种类型的欧拉迹,欧拉迹的变换。在第二卷中,详尽地介绍了著名的中国邮递员问题,欧拉迹的计数问题,最后讨论了与欧拉问题相关的算法和计算复杂性。每章后面配有习题,帮助读者理解和掌握本章的主要内容。 《欧拉与相关专题》适合从事图论研究的研究生和科研工作者使用,也是其他数学和计算机科学研究人员很好的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值