03-搜索与图论python

1-DFS

排列数字
N=10
path=[0]*N
state=[False]*N
def dfs(u):if u==n:for i in range(n):print(path[i],end=' ')print()for i in range(n):if state[i]==False:path[u]=i+1 state[i]=Truedfs(u+1)#恢复现场path[u]=0state[i]=False
n=int(input())
dfs(0)

采用位运算太优雅了,细细体会。

N=10
path=[0]*N #记录路径
def dfs(u,state): #state-状态if u==n: #递归到最后一个数for i in range(n):print(path[i],end=' ')print()for i in range(n):if not (state>>i&1):path[u]=i+1 dfs(u+1,state+(1<<i))
n=int(input())
dfs(0,0)           
n皇后问题

方式一全排列方式
对于之前的我来说这个完全是不懂啊。。现在好一些了&—&

def dfs(x):#开始检索第x行该如何填皇后if x==n:for i in range(n):for j in range(n):print(chessboard[i][j],end='')print()print()#开始寻找第x行中的那一列,能合法填皇后的位置for y in range(n):if not col[y] and not dg[y+x] and not udg[y-x+n]: #y=x+b=>b=y-x+n y=-x+b=>b=x+y chessboard[x][y]='Q'col[y]=1 dg[y+x]=1 udg[y-x+n]=1 dfs(x+1)  #开始观察x+1行#回溯udg[y-x+n]=0dg[y+x]=0col[y]=0chessboard[x][y]='.'
if __name__=="__main__":N=10n=int(input())chessboard=[['.' for _ in range(N)] for _ in range(N)]#哪些列,主/副对角线不符合条件col=[0]*Ndg=[0]*(2*N)udg=[0]*(2*N)dfs(0)

方法2-暴力枚举
将不放皇后的分支放在前面会超时。必须要有return

def dfs(x,y,queen):if y==n:#如果越界,考虑下一行的第一列y=0x+=1 if x==n:#填完了所有的皇后输出答案 if queen==n:for i in range(n):for j in range(n):print(chessboard[i][j],end='')print()print()return #没有填完所有的皇后,说明该不是所求解#开始对每个格子的情况进行枚举#分支:放皇后,开始在x,y位置填=皇后if not row[x] and not col[y] and not dg[y-x+n] and not udg[y+x]:chessboard[x][y]='Q'row[x],col[y],dg[y-x+n],udg[y+x]=1,1,1,1 dfs(x,y+1,queen+1)row[x],col[y],dg[y-x+n],udg[y+x]=0,0,0,0chessboard[x][y]='.'#分支:不放皇后dfs(x,y+1,queen)
if __name__=='__main__':N=10n=int(input())chessboard=[['.' for _ in range(N)] for _ in range(N)]row=[0]*Ncol=[0]*Ndg=[0]*2*Nudg=[0]*2*Ndfs(0,0,0)

BFS

走迷宫
def bfs():dx=[-1,0,1,0] #控制走的方向dy=[0,1,0,-1]queue=[(0,0)]trace[0][0]=0while queue:x,y=queue.pop(0)if (x,y)==(n-1,m-1):  #到达左下角return trace[x][y]for i in range(4): #枚举四个方向a=x+dx[i]b=y+dy[i] #得到向上下左右走一步之后的坐标。if 0<=a<n and 0<=b<m and graph[a][b]!=1 and trace[a][b]==-1:#如果这个点是合法路劲,且以前没有走过queue.append((a,b)) #将可以走通的路径的下一个点加入队列trace[a][b]=trace[x][y]+1 #在trace做一个标记。n,m=map(int,input().split())
N=101
graph=[[0]*N for _ in range(N)] #地图
trace=[[-1]*N for _ in range(N)] 
for i in range(n):graph[i][0:m]=list(map(int,input().split()))
print(bfs())
八数码
from collections import deque
dx=[-1,0,1,0]
dy=[0,1,0,-1]
def bfs(start):end='12345678x'#记录每个状态的交换次数,初始状态为0d={start:0}q=deque([start]) #记录队列头节点到了哪个状态while len(q):#头节点出队t=q.popleft()#保存当前头节点距离初始状态的交换次数distance=d[t]if t==end:return distance#找下表,交换顺序idx=t.find('x')x=idx//3  #将一维坐标转换为二维坐标y=idx%3 for i in range(4):a=x+dx[i]b=y+dy[i]if 0<=a<3 and 0<=b<3:t=list(t) #字符串不能交换,转换为列表交换t[idx],t[a*3+b]=t[a*3+b],t[idx]t=''.join(t)if t not in d: #如果心得状态不在字典里d[t]=distance+1 #添加新状态进入字典并赋值为上一个状态的交换次数+1q.append(t) #将新的状态入队#回退状态t=list(t)t[idx],t[a*3+b]=t[a*3+b],t[idx]t=''.join(t)return -1
n=input().split()
start=''
for c in n:start+=c
print(bfs(start))

树与图的深度优先遍历

树的重心
N=100010
M=2*N #以有向图的格式存储无向图,所以每个节点至多对应2n-2条边
e=[0]*M
ne=[0]*M
h=[-1]*N #邻接表存储树,有n个节点,所以需要n个队列头节点
idx=0
st=[False]*N  #记录节点是否被访问过,访问过则标记为true
ans=N #表示重心的所有的子树中,最大的子树的结点数目
def add(a,b): #a所对应的单链表中插入b  a作为根 global idx e[idx]=b ne[idx]=h[a]h[a]=idx idx+=1 
#表示u节点包含的最大连通块的点的个数
def dfs(u):global ansst[u]=Truesum=1 #节点的个数,起始值为自身节点的一个res=0 #用来比较最大连通块的点的个数i=h[u]while i!=-1:j=e[i]if not st[j]:s=dfs(j)res=max(res,s)sum+=s i=ne[i]#即最大的连通块点的个数res=max(res,n-sum)#结果取最小的连通块的个数ans=min(ans,res)return sum
n=int(input())
for i in range(n-1): #树中是不存在环的,对于有n个节点的树,必定是n-1条边a,b=map(int,input().split())add(a,b)add(b,a)
dfs(1)
print(ans)
图中点的层数
N=100010
e=[0]*N  #存储元素
ne=[0]*N #存下一个节点的位置
h=[-1]*N #存储树
idx=0  #每个节点的独特身份证
q=[0]*N #队列
d=[-1]*N #该节点到1号点的距离
def add(a,b): #构建树global idxe[idx]=bne[idx]=h[a]h[a]=idxidx+=1 
def bfs():hh,tt=0,0  #队头,队尾q[0]=1  #入队1号结点d[1]=0  #1号节点到本身的距离为0while hh<=tt:x=q[hh] hh+=1 #出队列i=h[x] #i指向头节点while i!=-1: #遍历该结点的孩子结点j=e[i]   #取出该节点元素if d[j]==-1: #该结点没有被遍历过d[j]=d[x]+1 #更新该结点距离1号点的距离tt+=1  #处理完该结点,入队列,以便后续来处理该结点的孩子结点q[tt]=ji=ne[i] #指向下一个节点,也就是该结点的孩子结点。return d[n]
n,m=map(int,input().split())
for i in range(m):a,b=map(int,input().split())add(a,b)
print(bfs())
拓补排序
N = 100010
e = [0]*N
ne = [0]*N
h = [-1]*N
idx = 0
# 入队
q = [0]*N
# 入度
d = [0]*Ndef add(a,b):global idxe[idx] = bne[idx] = h[a]h[a] = idxidx += 1def topsort():hh,tt = 0, -1# 点的编号是 1到 n,如果有入度为0的点,则把它入队for i in range(1,n+1):if not d[i]:tt += 1q[tt] = iwhile hh <= tt:t = q[hh]hh += 1i = h[t]while i != -1:j = e[i]# 入度减一d[j] -= 1if d[j] == 0:tt += 1q[tt] = ji = ne[i]return tt == n - 1n,m = map(int,input().split())
while m:m -= 1a,b = map(int,input().split())# 添加从a -> b 的一条边,b的入度 + 1add(a,b)d[b] += 1 if topsort(): #如果是拓补序列。for i in range(n):print(q[i],end=" ")
else:print(-1)
朴素Dijkstra算法
N = 510
# 因为题目的边远大于点,因此是稠密图,稠密图用邻接矩阵去存。
d = [[0x3f3f3f3f]*N for _ in range(N)]
# dist为每个点到起点的距离
dist = [0x3f3f3f3f]*N
# st表示每个点的最短距离已经确定了
st = [False]*Ndef dijkstra():dist[1] = 0# 迭代 n - 1 次,因为每迭代一次,一个点的最短距离就确定了,并把它加入到确定的集合当中。# 前 n - 1 个点已经确定,那么最后一个点自然也就是最短距离了,所以可以把 n 改成 n - 1for i in range(n-1):# 随便定义一个点,主要是为了后面比较,然后找到最小距离的点t = -1# 循环每个点,找到最短距离的点,并把它赋值给 tfor j in range(1,n+1):if not st[j] and dist[j] < dist[t]:t = j# 标记该点距离确定st[t] = True# 根据该点更新其他所有点的距离for j in range(1,n+1):dist[j] = min(dist[j], dist[t] + d[t][j])# 如果取到了最后一个点,则最后一个点的最短距离被找到,结束循环。if t == n:breakif dist[n] == 0x3f3f3f3f:return -1return dist[n]n,m = map(int,input().split())
while m:a,b,c = map(int,input().split())d[a][b] = min(d[a][b], c)m -= 1
print(dijkstra())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java基础-给个一键三联呗^_^哈哈

文章目录 1.注释修改注释字体三种注释方式 2.标识符和关键字3.数据类型4.类型转换5. 变量、常量、作用域6.基本运算符7.自增自减运算符、初识Math类8.逻辑运算符、位运算符9.三元运算符及小结10.包机制11.JavaDoc生成文档 1.注释 修改注释字体 打开设置Settings 三种注释方…

[Vulnhub靶机] DriftingBlues: 4

[Vulnhub靶机] DriftingBlues: 4靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues4_vh.ova 靶机地址&#xff1a;192.168.67.23 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …

【教学类-45-01】X-Y之间的三连加题(a+b+c=)

作品展示&#xff1a; 背景需求&#xff1a; 我常去的大4班孩子们基本都适应了0-5之间的加法题&#xff0c;做题速度极快。 为了增加“花样”&#xff0c;吸引幼儿参与&#xff0c;修改参数&#xff0c;从二连加12变为三连加111。 素材准备: 代码重点 代码展示 X-Y 之间的3…

增长中台建设与第三方平台调研

增长中台建设与第三方平台调研 前言一、增长策略 1.1 增长算法1.2 增长算法主要内容汇总1.3 增长策略参考材料二、增长中台建设 2.1 增长中台2.2 建设参考材料三、第三方增长中台 3.1 创量3.2 引力引擎3.3 增长参谋 adSpark3.4 买量小飞机&#xff08;舜飞科技&#xff09;3.5 …

Android studio ViewPager2 底部圆点指示器应用设计

一、activity_main.xml布局文件: <androidx.viewpager2.widget.ViewPager2android:id="@+id/viewpager2"android:layout_width="403dp"android:layout_height="442dp"app:layout_constraintEnd_toEndOf="parent"app:layout_const…

python编程从入门到实践(2)操作列表

3.4 列表-list-切片操作 numlist[1,2,3,4,5,6,7,8,9] numlist[::-1] #######运行结果######[9, 8, 7, 6, 5, 4, 3, 2, 1]numlist[1,2,3,4,5,6,7,8,9] numlist[::2]#######运行结果######[1, 3, 5, 7, 9]7.列表–list-常用操作符 list1[123,456] list2[456,789] list1>list2…

如何使用 CMakeLists.txt 在 CMake 项目中生成一个可执行程序

文章目录 main.cppCMakeLists.txt创建一个构建目录运行 CMake编译项目总结 main.cpp #include <iostream> /*** 代码作者&#xff1a;小秋SLAM入门实战* 开发环境&#xff1a;Ubuntu 16.04* 运行依赖&#xff1a;C 11*/ int main(int argc, char** argv){std::cout<&…

MySQL视图索引执行计划相关十五道面试题分享

目录 一. 视图 1.1 含义 1.2 操作 创建视图 修改视图 删除视图 查看视图 二. 索引 2.1 什么是索引 2.2 为什么要使用索引 2.3 优点 2.4 缺点 2.5 何时不适用索引 2.6 索引何时失效 三. 执行计划 3.1 什么是执行计划 3.2 执行计划的作用 四. 面试题 表结构 …

HTML5+CSS3小实例:人物介绍卡片2.0

实例:人物介绍卡片2.0 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

【计算机网络】网络基础--协议/网络协议/网络传输流程/地址管理

文章目录 一、计算机网络背景二、协议1.协议是什么2.为什么要有协议 三、网络协议1.为什么要进行协议分层2.OSI七层模型3.TCP/IP五层(或四层)模型 四、网络传输基本流程1.协议报头2.局域网3.数据包封装和分用4.网络传输流程图 五、网络中的地址管理1.认识IP地址2.认识MAC地址3.…

AI爆文变现:怼量也有技巧!如何提升你的创作收益

做AI爆文项目&#xff0c;赚小钱是没有问题的。 想要赚大钱&#xff0c;就是要做矩阵&#xff0c;怼量。 之前参加训练营的时候&#xff0c;也是要求怼量。 怼量&#xff0c;加高质量文章&#xff0c;让你的收益更高。 如何提升文章质量&#xff0c;减少AI味&#xff0c;AI…

提升技术,必看的8个开源库,都很通俗易懂

提升技术&#xff0c;必看的8个开源库&#xff0c;都很通俗易懂 随着工作年限越来越高&#xff0c;越来越觉得闭门造车是一种非常不好的习惯&#xff0c;还是得多看看别人是怎么写代码的&#xff0c;毕竟人外有人嘛&#xff0c;所以我觉得多看看开源库的源码&#xff0c;是一种…

线性规划基本原理与案例分析

线性规划(Linear Programming 简记LP)则是数学规划的一个重要分支。 什么叫做线性规划&#xff1f;一般来讲&#xff0c;目标函数和约束函数均是线性的叫做线性规划问题。线性规划必须满足以下三种基本性质 例1.1 某机床厂生产甲、乙两种机床&#xff0c;每台销售后的利润分别…

【RocketMQ每日一问】RocketMQ如何保证消息不丢失?

1.生产端 不要使用oneway方式发送&#xff0c;因为这种方式不会有返回结果设置重试次数发送失败添加回调对消息进行处理 2.broker端 开启同步刷盘flushDiskType SYNC_FLUSH &#xff0c;这样在刷盘失败的时候会返回SendStatus.FLUSH_DISK_TIMEOUT开启主从同步复制&#xff…

多线程基础知识点

1. 进程 一个正在执行中的程序就是一个进程&#xff0c;系统会为这个进程发配独立的【内存资源】。进程是程序的一次执行过程&#xff0c;它有自己独立的生命周期&#xff0c;它会在启动程序时产生&#xff0c;运行程序时存在&#xff0c;关闭程序时消亡。 例如&#xff1a;正…

胡圆圆的暑期实习经验分享

背景 实验室一般是在研究生二年级的时候会放实习&#xff0c;在以后的日子就是自己完成毕业工作要求&#xff0c;基本上不再涉及实验室的活了&#xff0c;目前是一月份也是开始准备暑期实习的好时间。实验室每年这个时候都会有学长学姐组织暑期实习经验分享&#xff0c;本着不…

uView IndexList 索引列表

通过折叠面板收纳内容区域 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 外层包裹一个index-list组件&#xff0c;锚点通过index-anchor组件传入&#xff0c;自定义列表内容通过index-item嵌套使用 nvue需要将…

【Redis】非关系型数据库之Redis的增删改查

目录 一、Redis的数据类型分类 二、Redis的字符串类型string 三、Redis的列表list 四、Redis的哈希hash 五、Redis的无序集合set 六、Redis的有序集合zset 七、Redis的通用命令 一、Redis的数据类型分类 通常Redis的数据类型有五大基础类型 String&#xff08;字符串&am…

Beauty algorithm(二)唇妆

实现唇妆过程中首先确定唇部位置,其次对该区域进行渲染。 一、skills 前瞻 1、cv::convexHull 在点集中寻找凸包点 void convexHull( InputArray points, OutputArray hull, bool clockwise = false, bool returnPoints = true ); 参数poi…

安全加固之weblogic屏蔽T3协议

一、前言 开放weblogic控制台的7001端口&#xff0c;默认会开启T3协议服务&#xff0c;T3协议则会触发的Weblogic Server WLS Core Components中存在反序列化漏洞&#xff0c;攻击者可以发送构造的恶意T3协议数据&#xff0c;获取目标服务器权限。 本文介绍通过控制T3协议的访问…