前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法基础-搜索与图论

算法基础-搜索与图论

作者头像
她的店里只卖樱花
发布2022-10-31 16:41:23
4300
发布2022-10-31 16:41:23
举报
文章被收录于专栏:常用算法模板

DFS

01.排列数字

题目描述

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1\le n\le 7

输入样例:

代码语言:javascript
复制
3

输出样例:

代码语言:javascript
复制
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

题解

时间复杂度

O(n\cdot n!)

核心思想

  • path 数组保存排列,当排列的长度为 n 时,是一种方案,输出。
  • st 数组表示数字是否用过。当st[i]true 时:i 表示已用,否则未用。
  • dfs(i) 表示的含义是:在 path[i]处填写数字,然后递归的在下一个位置填写数字。
  • 回溯:第 i 个位置填写某个数字的所有情况都遍历后, 第 i 个位置填写下一个数字。

核心函数

代码语言:javascript
复制
void dfs(int u){
	
	if(u == n)
	{	
		for(int i = 0; i < n; i ++ ) 
			cout << path[i] << ' ';
		cout << endl;
		return; 
	}
	else 
	{	

		for(int i = 1; i <= n; i ++ ) 
		{	
			if(!st[i])
                                      			{	 
				path[u] = i; 
				st[i] = 1; 
				dfs(u + 1); 
				st[i] = 0; // 回溯 
			}
		}
	}

}

代码实现

代码语言:javascript
复制
#include <iostream>

using namespace std;  

const int N = 10; 
int n, path[N]; 
bool st[N]; 


void dfs(int u){
	
	if(u == n)
	{	
		for(int i = 0; i < n; i ++ ) 
			cout << path[i] << ' ';
		cout << endl;
		return; 
	}
	else 
	{	
		for(int i = 1; i <= n; i ++ ) 
		{	
			if(!st[i])
			{	
				path[u] = i; 
				st[i] = 1; 
				dfs(u + 1); 
				st[i] = 0; 
			}
		}
	}

}

int main (){
    cin >> n; 
    dfs(0); 
    return 0; 
    
}

02.n-皇后问题

BFS

01.走迷宫

02.八数码

树与图的深度优先遍历

01.树的重心

树与图的广度优先遍历

01.图中点的层次

拓扑排序

01.有向图的拓扑序列

Dijkstra

01.Dijkstra求最短路I

02.Dijkstra求最短路II

bellman-ford

01.有边数限制的最短路

Spfa

01.spfa求最短路

02.spfa判断负环

Floyd

01.Floyd求最短路

Prim

01.Prim算法求最小生成树

Kruskal

01.kruskal算法求最小生成树

染色法判定二分图

01.染色法判定二分图

匈牙利算法

01.二分图的最大匹配

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DFS
    • 01.排列数字
      • 题目描述
      • 题解
    • 02.n-皇后问题
    • BFS
      • 01.走迷宫
        • 02.八数码
        • 树与图的深度优先遍历
          • 01.树的重心
          • 树与图的广度优先遍历
            • 01.图中点的层次
            • 拓扑排序
              • 01.有向图的拓扑序列
              • Dijkstra
                • 01.Dijkstra求最短路I
                  • 02.Dijkstra求最短路II
                  • bellman-ford
                    • 01.有边数限制的最短路
                    • Spfa
                      • 01.spfa求最短路
                        • 02.spfa判断负环
                        • Floyd
                          • 01.Floyd求最短路
                          • Prim
                            • 01.Prim算法求最小生成树
                            • Kruskal
                              • 01.kruskal算法求最小生成树
                              • 染色法判定二分图
                                • 01.染色法判定二分图
                                • 匈牙利算法
                                  • 01.二分图的最大匹配
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档