0
点赞
收藏
分享

微信扫一扫

蓝桥杯 第三十四天

Ad大成 2022-03-11 阅读 44

 

目录

1.843. n-皇后问题 - AcWing题库

2.走迷宫

3.树的重心

4.图中点的层次

5.拓扑排序

6.849. Dijkstra求最短路 I - AcWing题库

7.853. 有边数限制的最短路 - AcWing题库

8.851. spfa求最短路 - AcWing题库

9.SPFA求负环

10.Floyd


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])
举报

相关推荐

0 条评论