第三讲 搜索与图论
包括DFS,BFS,树与图的深度优先遍历,树与图的广度优先遍历,拓扑排序,Dijkstra,bellman-ford,spfa,Floyd,Prim,Kruskal,染色法判定二分图,匈牙利算法等内容。
falldeep
远和近
展开
-
搜索与图论
最小生成树 prime 算法 边稠密 kruskal 算法 边稀疏原创 2021-08-29 21:04:31 · 24563 阅读 · 0 评论 -
排列数字(dfs)
题目给定一个整数n,将数字1∼n 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1代码#include<iostream>using namespace std;const int N = 10;i...原创 2021-07-13 16:11:13 · 511 阅读 · 1 评论 -
数的重心(深度优先遍历C++)
题目给定一颗树,树中包含n个结点(编号1∼n)和n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n−1 行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示将重心删除后,剩余各个连通块中点数的最大值。数据范围...原创 2021-07-15 15:59:13 · 315 阅读 · 0 评论 -
n-皇后问题dfs(c++)
题目n−皇后问题是指将n个皇后放在n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意...原创 2021-07-13 18:15:09 · 399 阅读 · 0 评论 -
Dijkstra求最短路 (C++)
题目给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出−1。数据范围1≤n≤500,1≤m≤105,图中涉及边长均不超过1000...原创 2021-07-16 11:28:13 · 240 阅读 · 0 评论 -
染色法判定二分图(C++)
题目给定一个n个点m条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。输出格式如果给定图是二分图,则输出Yes,否则输出No。数据范围1≤n,m≤105输入样例:4 41 31 42 32 4输出样例:Yes代码#include<iostream>#include<...原创 2021-07-19 16:59:35 · 262 阅读 · 0 评论 -
有边数限制的最小数(bellman-ford算法)
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,。请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出impossible。注意:图中可能。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。如果不存在满足条件的路径,则输出impossible。数据范围。原创 2021-07-16 21:13:00 · 379 阅读 · 0 评论 -
八数码(bfs)C++
题目在一个3×3 的网格中,1∼8 这8个数字和一个x恰好不重不漏地分布在这3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把x与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让x先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 ...转载 2021-07-14 20:41:37 · 337 阅读 · 0 评论 -
有向图的拓扑排序(C++)
题目给定一个n个点m条边的有向图,点的编号是1到n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出−1。若一个由图中所有点构成的序列AA满足:对于图中的每条边(x,y),x在A中都出现在y之前,则称A是该图的一个拓扑序列。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数x和y,表示存在一条从点x到点y的有向边 (x,y)。输出格式共一行,如果存在拓扑序列,则输出任意...原创 2021-07-15 19:46:30 · 653 阅读 · 0 评论 -
KrusKal算法求最小生成树(C++)
题目给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n−1 条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。输入格式第一行包含两个整数n和m。接下来m行...转载 2021-07-19 14:28:30 · 411 阅读 · 0 评论 -
n-皇后问题(非递归C++)
题目n−皇后问题是指将n个皇后放在n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意...转载 2021-07-13 18:49:21 · 686 阅读 · 0 评论 -
prime算法求最小生成树(C++)
题目给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图G=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V|,m=|E|。由V中的全部n个顶点和E中n−1 条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图G的最小生成树。输入格式第一行包含两个整数n和m。接下来m行...转载 2021-07-19 13:42:21 · 792 阅读 · 0 评论 -
Floyd求最短路(C++)
题目给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出impossible。数据保证图中不存在负权回路。输入格式第一行包含三个整数n,m,k。接下来mm行,每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。接下来k行,每行包含两个整数x,y,表示询问点x到点y的最短距离。输出格式...原创 2021-07-17 21:11:23 · 167 阅读 · 0 评论 -
spfa判断负环(C++)
题目给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式如果图中存在负权回路,则输出Yes,否则输出No。数据范围1≤n≤2000,1≤m≤10000,图中涉及边长绝对值均不超过10000。输入样例:3 31 2 -12 3 43 1 -4输出...原创 2021-07-17 15:58:19 · 466 阅读 · 0 评论 -
迷宫问题(bfs)
题目给定一个n×m 的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n,m) 处,至少需要移动多少次。数据保证(1,1) 处和(n,m) 处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数(0或1),表示完整的...转载 2021-07-14 08:48:45 · 197 阅读 · 0 评论 -
图中点的层次(广度优先遍历C++)
题目给定一个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 51 22 33 4...原创 2021-07-15 18:41:22 · 127 阅读 · 1 评论 -
二分图的最大匹配(匈牙利算法)
题目给定一个二分图,其中左半部包含n1个点(编号1∼n1),右半部包含 n2个点(编号1∼n2),二分图共包含m条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集 {E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。输入格式第一行包含三个整数 n1、...转载 2021-07-20 18:42:27 · 108 阅读 · 0 评论 -
dijkstra求最短路(堆优化)
题目给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出−1。数据范围1≤n,m≤1.5×105图中涉及边长均不小于0,且不超过...原创 2021-07-16 15:15:06 · 179 阅读 · 0 评论 -
spfa求最短路(C++)
题目给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式输出一个整数,表示1号点到n号点的最短距离。如果路径不存在,则输出impossible。数据范围1≤...原创 2021-07-17 15:56:35 · 271 阅读 · 0 评论