目录
6.849. Dijkstra求最短路 I - AcWing题库
1.843. n-皇后问题 - AcWing题库
n=int(input())
ans=0
def isvalid(row,col,path):
if col in path:
return False
for i in range(len(path)):
x,y=i,path[i]
if abs(x-row)==abs(y-col):
return False
return True
def p(path):
for i in path:
if i!=0:
print('.'*i,end="")
print('Q',end="")
if n-i-1!=0:
print('.'*(n-i-1))
if n-i-1==0:
print()
return
def dfs(row,path):
global ans
if row==n:
p(path)
print()
return
for i in range(n):
if isvalid(row,i,path):
dfs(row+1,path+[i])
dfs(0,[])
2.走迷宫
# 5 5
# 0 1 0 0 0
# 0 1 0 1 0
# 0 0 0 0 0
# 0 1 1 1 0
# 0 0 0 1 0
def isvalid(x,y):
if x<0 or x>=n:
return False
if y<0 or y>=m:
return False
if vis[x][y]==True:
return False
return True
def bfs():
from collections import deque
q=deque([])
q.append((0,0))
vis[0][0]=True
ans=0
dx=[-1,0,+1,0]
dy=[0,+1,0,-1]
while q:
length=len(q)
for i in range(length):
top=q.popleft()
x,y=top[0],top[1]
if x==n-1 and y==m-1:
print(ans)
return
for i in range(4):
newx=x+dx[i]
newy=y+dy[i]
if isvalid(newx,newy):
q.append((newx,newy))
ans += 1
return
n,m=map(int,input().split())
vis=[[False for i in range(m)]for j in range(n)]
martix=[]
for i in range(n):
martix.append(list(map(int,input().split())))
bfs()
3.树的重心
# 9
# 1 2
# 1 7
# 1 4
# 2 8
# 2 5
# 4 3
# 3 9
# 4 6
def dfs(cur):
global ans
vis[cur]=True
sums=1
size=0
for i in adj[cur]:
if not vis[i]:
son=dfs(i)
sums+=son
size=max(size,son)
size=max(size,n-sums)
ans=min(ans,size)
return sums
n=int(input())
adj=[[]for i in range(n+1)]
ans=1<<31
vis=[False for i in range(n+1)]
for i in range(n-1):
a,b=map(int,input().split())
adj[a].append(b)
adj[b].append(a)
dfs(1)
print(ans)
4.图中点的层次
# 4 5
# 1 2
# 2 3
# 3 4
# 1 3
# 1 4
# ans:1
def bfs():
from collections import deque
q=deque([])
q.append(1)
vis[1]=True
ans=0
while q:
length=len(q)
for i in range(length):
top=q.popleft()
if top==n:
print(ans)
return
for j in adj[top]:
q.append(j)
ans+=1
n,m=map(int,input().split())
adj=[[]for i in range(n+1)]
vis=[False for i in range(n+1)]
for i in range(m):
a,b=map(int,input().split())
adj[a].append(b)
bfs()
5.拓扑排序
# 3 3
# 1 2
# 2 3
# 1 3
# ans: 1 2 3
def bfs():
from collections import deque
q=deque([])
for i in range(1,n+1):
if d[i]==0:
q.append(i)
while q:
top=q.popleft()
print(top)
for i in adj[top]:
d[i]-=1
if d[i]==0:
q.append(i)
n,m=map(int,input().split())
adj=[[]for i in range(n+1)]
d=[0 for i in range(n+1)]
for i in range(m):
x,y=map(int,input().split())
adj[x].append(y)
d[y]+=1
bfs()
6.849. Dijkstra求最短路 I - AcWing题库
def dijkstra():
d=[1<<31 for i in range(n+1)]
vis = [False for i in range(n + 1)]
d[1]=0
for _ in range(n):
index,minlength=-1,1<<31
for i in range(1,n+1):
if not vis[i]:
if d[i]<minlength:
index=i
minlength=d[i]
vis[index]=True
for i in adj[index]:
x,v=i
if not vis[x]:
if v+d[index]<d[x]:
d[x]=v+d[index]
if d[n]==1<<31:
print(-1)
else:
print(d[n])
n,m=map(int,input().split())
adj=[[]for i in range(n+1)]
for _ in range(m):
x,y,z=map(int,input().split())
adj[x].append((y,z))
dijkstra()
7.853. 有边数限制的最短路 - AcWing题库
import copy
def bellman_ford():
dis = [1 << 31 for i in range(n + 1)]
dis[1] = 0
for _ in range(k):
discopy=copy.deepcopy(dis)
for i in range(1,n+1):
for j in adj[i]:
x,v=j
if dis[x]>v+discopy[i]:
dis[x]=v+discopy[i]
if dis[n]>1<<30:
return "impossible"
else:
return dis[n]
n,m,k=map(int,input().split())
adj=[[]for i in range(n+1)]
for i in range(m):
x,y,z=map(int,input().split())
adj[x].append((y,z))
print(bellman_ford())
8.851. spfa求最短路 - AcWing题库
def spfa():
dis=[1<<31 for i in range(n+1)]
dis[1]=0
from collections import deque
q=deque([1])
while q:
top=q.popleft()
for i in adj[top]:
x,v=i
if dis[x]>dis[top]+v:
dis[x]=dis[top]+v
q.append(x)
if dis[n]>1<<30:
print("impossible")
else:
print(dis[n])
return
n,m=map(int,input().split())
adj=[[]for i in range(n+1)]
for i in range(m):
x,y,z=map(int,input().split())
adj[x].append((y,z))
spfa()
9.SPFA求负环
# 3 3
# 1 2 -1
# 2 3 4
# 3 1 -4
def spfa():
from collections import deque
q=deque([i for i in range(1,n+1)])
vis=[True for i in range(n+1)]
cnt=[0 for i in range(n+1)]
dis=[1<<31 for i in range(n+1)]
dis[1]=0
while q:
top=q.popleft()
vis[top]=False
for i in adj[top]:
x,v=i
if dis[x]>dis[top]+v:
dis[x]=dis[top]+v
cnt[x]=cnt[top]+1
if cnt[x]>=n:
return True
if not vis[x]:
vis[x]=True
q.append(x)
return False
n,m=map(int,input().split())
adj=[[]for i in range(n+1)]
for i in range(m):
x,y,z=map(int,input().split())
adj[x].append((y,z))
if spfa():
print("Yes")
else:
print("No")
10.Floyd
# 3 3 2
# 1 2 1
# 2 3 2
# 1 3 1
# 2 1
# 1 3
# ans:
# impossible
# 1
def floyd():
for k in range(1,n+1):
for i in range(1,n+1):
for j in range(1,n+1):
dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j])
n,m,k=map(int,input().split())
dis=[[1<<31 for i in range(n+1)]for j in range(n+1)]
adj=[[]for i in range(n+1)]
for i in range(m):
x,y,z=map(int,input().split())
dis[x][y]=z
floyd()
for i in range(k):
x,y=map(int,input().split())
if dis[x][y]==1<<31:
print("impossible")
else:
print(dis[x][y])