【蓝桥杯考前一天总结PYthon终结篇】
最短路之Floyd:
適用領(lǐng)域:既可以是有向圖也可以是無向圖,權(quán)重可以為負(fù),通常用來求各頂點之間的距離(多源)
缺點就是時間復(fù)雜度高,加上Python本身跑得慢....就祈禱這次題數(shù)據(jù)量不要太大
優(yōu)點就是比起狄克斯特拉算法,簡單地多,代碼量少,容易上手
板子:
n=int(input())#這個根據(jù)題意設(shè)置,表示結(jié)點個數(shù)edge=[[float('inf')]*n for i in range(n)] #初始化所有邊權(quán)為無窮大#根據(jù)題意更新edge[i][j] #更新的時候,如果有無向圖需要edge[i][j]=edge[j][i]這樣設(shè)置,否則不用#三重循環(huán) 結(jié)束 for k in range(n):for i in range(n):for j in range(n):edge[i][j]=min(edge[i][j],edge[i][k]+edge[k][j])最短路之狄克斯特拉:
適用領(lǐng)域:既可以是無向圖也可以有向圖,權(quán)值必須非負(fù),求某個頂點到其他頂點的最短距離(單源)
缺點:寫起來會稍微麻煩一點比起Floyd 東西比較多
優(yōu)點:跑的挺快的,數(shù)據(jù)量比較大的時候也能用Python解決
板子:
n=int(input())#根據(jù)題意 n代表結(jié)點個數(shù)edge={} #edge[i]={x:費用1,y:費用1....} 存結(jié)點之間的費用cost=[] #cost[i]代表結(jié)點i到出發(fā)點的最短開銷s=set() #集合s用于存儲處理過的結(jié)點def find_node():#find_node函數(shù)用于尋找未被處理過的最便宜的結(jié)點node,spend=None,float('inf')for i in range(n):if cost[i]<=spend and i not in s:#node,spend=i,cost[i]return nodewhile node:#只要還有結(jié)點未被處理for i in edge[node]:#遍歷node的鄰居cost[i]=min(cost[i],cost[node]+edge[node][i])s.add(node)node=find_nodeprint(#根據(jù)你的需要輸出出發(fā)點到某個結(jié)點i的費用cost[i])#此外補充一個,如果題還要我們求最短路徑上邊的個數(shù) #只需外加一個字典pre 每當(dāng)更新cost[i]時,創(chuàng)建一個鍵值對 #最后通過終點逆向遍歷統(tǒng)計次數(shù)即邊數(shù) 輸出即可取模運算法則:
知識點:若x>y>0,若p=x%y,那么p一定小于y,即p∈[0,y-1]?
兩屆連續(xù)考察了這個知識點!!重視
二分答案、Bisect模塊:
題目中出現(xiàn)最大的某某的最小值,最小的某某的最大值,沒有思路時,往往可以直接去二分答案
板子:check函數(shù)是核心
#l,r根據(jù)題意設(shè)置 紅藍(lán)區(qū)域自己定義劃分def check(x):#假設(shè)x為答案#題目一般有有個約束條件#如果通過某種手段使得在x的條件下存在符合約束條件的解#那么就是可行解while l+1!=r:mid=(l+r)//2if check(mid):r=midelse:l=mid#取l還是r依據(jù)需要Bisect模塊:(只能用在升序數(shù)組,它源碼寫的時候就默認(rèn)這個了QWQ)
import bisecta=[0,1,2,3,3,3,5]#一段升序數(shù)組bisect.bisect(a,b)#返回數(shù)組a中最后一個<=b的數(shù)字的下標(biāo)+1#bisect.bisect(a,3)返回6bisect.bisect_left(a,3)#返回數(shù)組中第一個等于3的下標(biāo)#bisect.bisect_left(a,3)返回3#如果不存在等于3的,和bisect.bisect等效bisect.bisect_right(a,3)#返回數(shù)組中最后一個等于3的下標(biāo)+1#bisect.bisect_right(a,3)返回6#如果不存在等于3的,和bisect.bisect等效這個模塊通常用于查詢某個序列內(nèi) 屬于某個區(qū)間的數(shù)的個數(shù),>=p還是<=p?效率很高
當(dāng)然也可以直接用列表解析式+len函數(shù),但效率不高
len([i for i in a if i<=p]) #p自己設(shè)定[貢獻(xiàn)值法]:研究單個元素被引入后對結(jié)果的增量,實際上是把復(fù)雜的大問題轉(zhuǎn)化為一個個小問題,當(dāng)問題難以入手時,可以考慮這個做法
并查集:
板子
n=int(input()) #根據(jù)題意輸入節(jié)點個數(shù) #初始化 parent=[i for i in range(n)]#查找 def find_root(x):if parent[x]!=x:parent[x]=find_root(parent[x])return parent[x] #合并 def uion(x,y):x_root,y_root=find_root(x),find_root(y)parent[x_root]=y_root用途很廣,考的頻率也高哦,考試的時候多往這里想一想
最小生成樹:
適用場景:對于有n個頂點的連通圖,其中只有n-1條邊的連通子圖即最小生成樹
常常這n-1條邊被賦予了權(quán)值 我們需要求出最小權(quán)值和
板子:里面有并查集的內(nèi)容!
n=int(input())edge=[]#edge[i]=[a,b,c]代表i這條邊連接了a,b,權(quán)值為cans=0#權(quán)值和edge.sort(key=lambda x:x[2])#按邊權(quán)升序排序for x in edge:#遍歷所有邊a,b,c=x[0],x[1],x[2]if find_root(a)!=find_root(b) and j<=n-1:#兩頂點不連通且當(dāng)前邊數(shù)小于n-1ans+=x[2]#權(quán)值累加union(a,b)j+=1print(ans)拓?fù)渑判?#xff1a;?
適用場景:有向圖,檢測環(huán),有向無環(huán)圖一定有拓?fù)湫蛄小?/span>
板子:
graph={'a':'bc','b':'ef'} #graph的key表示入邊,value表示被指向的點indegrees=dict((i,0) for i in graph) #初始化入度為0for i in graph:for j in graph[i]:#遍歷i的鄰居 鄰居入度+1indegrees[j]+=1stack=[]#存入度為0的點 seq=[]#存拓?fù)湫蛄衒or i in indegrees:if indegrees[i]==0:#入度為0stack.append(i)#入棧while stack:#棧不為空t=stack.pop(0)seq.append(t)for i in graph[t]:#鄰居入度-1indegrees[i]-=1if indegrees[i]==0:stack.append(i)if len(seq)==len(graph):#無環(huán) else:#有環(huán)有關(guān)DP的,這里直接引用小藍(lán)的筆記啦,也就是這次的榜一~寫的很棒!
【動態(tài)規(guī)劃】內(nèi)容很詳實,左側(cè)傳送門?小藍(lán)刷題的博客_
?感謝藍(lán)橋杯一路陪伴 感謝對小鄭的支持
希望明天和我一起沖擊Python組的伙伴一舉拿下省一 一起見證國賽!
愿所有的努力都有回報!
總結(jié)
以上是生活随笔為你收集整理的【蓝桥杯考前一天总结PYthon终结篇】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github上开源仿京东商城项目启动配置
- 下一篇: Squid代理服务器(缓存加速之Web缓