蓝桥杯 第十三天 图算法

目录

1.题目详情 - 1034 Head of a Gang (30 分) (pintia.cn)

2.题目详情 - 1076 Forwards on Weibo (30 分) (pintia.cn)

3.dijkstra

4.题目详情 - 1003 Emergency (25 分) (pintia.cn)

(1)dijkstra解法

(2)dijkstra+dfs

(3)bellman算法

5.SPFA


1.题目详情 - 1034 Head of a Gang (30 分) (pintia.cn)

adj=[[0 for i in range(26)]for j in range(26)]
weight=[0 for i in range(26)]
vis=[False for i in range(26)]
stringtoint={}
inttostring={}
gang={}

person=0
def change(string):
    global person
    if string not in stringtoint:
        num=person
        person+=1
    else:
        num=stringtoint[string]
    stringtoint[string]=num
    inttostring[num]=string
    return num

def main():
    def dfstravel():
        def dfs(curindex):
            nonlocal head, curnum, curvalue
            curnum += 1
            vis[curindex] = True
            if weight[curindex] > weight[head]:
                head = curindex
            for i in range(person):
                if adj[curindex][i] != 0:
                    curvalue += adj[curindex][i]
                    adj[curindex][i] = 0
                    adj[i][curindex] = 0
                    if not vis[i]:
                        dfs(i)
            return
        global person
        nonlocal b
        for i in range(person):
            if not vis[i]:
                head, curnum, curvalue = i, 0, 0
                dfs(i)
                if curnum > 2 and curvalue > b:
                    gang[head] = curnum
        return
    a,b=map(int,input().split())
    for i in range(a):
        x,y,z=input().split()
        z=int(z)
        x=change(x)
        y=change(y)
        adj[x][y]+=z
        adj[y][x]+=z
        weight[x]+=z
        weight[y]+=z
    dfstravel()
    print(len(gang))
    for i,j in gang.items():
        print(inttostring[i],j)
main()

2.题目详情 - 1076 Forwards on Weibo (30 分) (pintia.cn)

adj=[[]for i in range(101)]
vis=[False for i in range(101)]
a,b=map(int,input().split())
for i in range(1,a+1):
    u=list(map(int,input().split()))
    for j in range(1,len(u)):
        adj[u[j]].append(i)
check=list(map(int,input().split()))
def bfs(index):
    from collections import deque
    q=deque([index])
    vis[index]=True
    level=0
    ans=0
    global b
    while q and level<b:
        size=len(q)
        for x in range(size):
            top=q.popleft()
            level+=1
            for i in adj[top]:
                if not vis[i]:
                    ans+=1
                    q.append(i)
                    vis[i]=True
    return ans
def init():
    global vis
    vis=[False for i in range(101)]
for i in check[1:]:
    init()
    print(bfs(i))

3.dijkstra

v,l,s=map(int,input().split())
adj=[[]for i in range(v)]
for i in range(l):
    x,y,z=map(int,input().split())
    adj[x].append((y,z))
vis=[False for i in range(v)]
d=[1<<31 for i in range(v)]
def dijkstra(adj,d,s):
    d[s]=0
    for x in range(v):
        minindex=-1
        minlength=1<<31
        for i in range(v):
            if not vis[i] and d[i]<minlength:
                minindex=i
                minlength=d[i]

        if minindex==-1:
            return
        vis[minindex]=True
        for i in adj[minindex]:
            des=i[0]
            length=i[1]
            if not vis[des] and d[minindex]+length<d[des]:
                d[des]=d[minindex]+length
    return
dijkstra(adj,d,s)
print(d)



# 6 8 0
# 0 1 1
# 0 3 4
# 0 4 4
# 1 3 2
# 2 5 1
# 3 2 2
# 3 4 3
# 4 5 3

4.题目详情 - 1003 Emergency (25 分) (pintia.cn)

(1)dijkstra解法

n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[0 for i in range(n)]
nums=[0 for i in range(n)]
for i in range(m):
    a,b,c=map(int,input().split())
    adj[a].append((b,c))
    adj[b].append((a,c))
def dijkstra(adj,d,s):
    d[s]=0
    nums[s]=1
    w[s]=weight[s]
    for x in range(n):
        minindex = -1
        minlength = 1 << 31
        for i in range(n):
            if not vis[i] and d[i]<minlength:
                minlength=d[i]
                minindex=i
        if minindex==-1:
            return
        vis[minindex]=True
        for i in adj[minindex]:
            index=i[0]
            long=i[1]
            if not vis[index]:
                if d[minindex]+long<d[index]:
                    d[index]=d[minindex]+long
                    nums[index]=nums[minindex]
                    w[index]=w[minindex]+weight[index]
                elif d[minindex]+long==d[index]:
                    nums[index]+=nums[minindex]
                    if w[index]<w[minindex]+weight[index]:
                        w[index]=w[minindex]+weight[index]
    return
dijkstra(adj,d,s)
print(nums[e],w[e])

(2)dijkstra+dfs

n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[weight[i] for i in range(n)]
nums=[0 for i in range(n)]
pre=[[]for i in range(n)]
for i in range(m):
    a,b,c=map(int,input().split())
    adj[a].append((b,c))
    adj[b].append((a,c))
def dijkstra(adj,d,s):
    d[s]=0
    nums[s]=1
    w[s]=weight[s]
    for x in range(n):
        minindex = -1
        minlength = 1 << 31
        for i in range(n):
            if not vis[i] and d[i]<minlength:
                minlength=d[i]
                minindex=i
        if minindex==-1:
            return
        vis[minindex]=True
        for i in adj[minindex]:
            index=i[0]
            long=i[1]
            if not vis[index]:
                if d[minindex]+long<d[index]:
                    d[index]=d[minindex]+long
                    pre[index].clear()
                    pre[index].append(minindex)
                elif d[minindex]+long==d[index]:
                    pre[index].append(minindex)
    return
ans=0
answeight=-1
def dfs(s,v,path):
    if v==s:
        global ans,answeight
        ans+=1
        weights=0
        path.append(v)
        for i in path:
            weights+=weight[i]
        if weights>answeight:
            answeight=weights
        return
    for i in pre[v]:
        dfs(s,i,path+[v])

dijkstra(adj,d,s)
dfs(s,e,[])
print(ans,answeight)

(3)bellman算法

注意前驱

n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[0 for i in range(n)]
nums=[0 for i in range(n)]
pre=[set() for i in range(n)]
for i in range(m):
    a,b,c=map(int,input().split())
    adj[a].append((b,c))
    adj[b].append((a,c))
def bellman(s):
    d[s]=0
    w[s]=weight[s]
    nums[s]=1
    for i in range(n-1):
        for u in range(n):
            for v in adj[u]:
                index=v[0]
                length=v[1]
                if d[u]+length<d[index]:
                    d[index]=d[u]+length
                    w[index]=w[u]+weight[index]
                    nums[index]=nums[u]
                    pre[index].clear()
                    pre[index].add(u)
                elif d[u]+length==d[index]:
                    if w[index]<w[u]+weight[index]:
                        w[index]=w[u]+weight[index]
                    pre[index].add(u)
                    nums[index]=0
                    if index==e:
                        print(pre[index])
                    for i in pre[index]:
                        nums[index]+=nums[i]
bellman(s)
print(nums[e],w[e])

5.SPFA

inq=[False for i in range(n)]
def spfa(s):
    d[s]=0
    from collections import deque
    q=deque([s])
    inq[s]=True
    nums[s]+=1
    while q:
        top=q.popleft()
        inq[top]=False
        for i in adj[top]:
            index=i[0]
            length=i[1]
            if d[top]+length<d[index]:
                d[index]=d[top]+length
                if not inq[index]:
                    q.push(index)
                    inq[index]=True
                    nums[index]+=1
                    if nums[index]>=n:
                        return False
    return True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值