更新 學習筆記 凸包 K短路

2021-08-09 23:06:08 字數 1955 閱讀 1853

這週cyc的套題裡出現了兩個新的演算法,乙個是計算幾何之凸包,還有乙個是最短路擴充套件之k短路,在此做乙個**

凸包專題:那麼構建凸包之後我們相當於用最短的長度將平面內所有的點包圍起來(兩點之間線段最短),對於乙個凸包,我們從它的原點(即圖中紅點),向點集中的中間點(圖中點6)連一根線,會將凸包分成兩個凸狀的東西。。。向上凸的叫上凸殼,向下的就叫下凸殼。

那麼如何構建乙個凸包呢,我們需要了解到乙個東西:向量的叉積,用來判斷平面內兩向量之間

那麼我們就可以先將平面上點的座標按x座標排序,之後呢分上凸殼,下凸殼來構建,因為分開來,圖形具有上凸或下凸的性質,我們就可以開乙個棧,不斷調整乙個三元點對(i,j,k)看哪一對點可能組成凸包的乙個線段,舉個例子:線段下凸,即如果有不合法的點,那麼新進來乙個點,我們和當前棧頂前乙個點連線,用叉積判斷是否在當前棧頂和前乙個點的連線的右邊,如果是,則當前棧頂不可能在凸包上(因為圖形下凸),以此類推,來更新圖形的線段,由於點的座標呈有序性,則必定能夠得到凸包。。。。(在圖形上按照這種方法推演一下構建凸包有助於理解)o(

nlog

n),效能非常優秀。。

再來講講k短路:

k短路,就是在圖形中找到第k短的路徑,求最短路徑中一我們會運用spfa或者是dij + heap求解,執行很快,那麼對於這一類問題,我們的想法一般是對於一張圖,先尋找第一短路,然後尋找第二短路,直至尋找到第k短路。。那麼在求解最短路的情況下就可以運用spfa和dij + heap了(前提是路徑不重複的情況下)

先不考慮路徑重不重複,先想一般求解方法,也就是這個不斷尋找第i短路的過程怎麼實現呢??我們一般會運用bfs來求解,不斷擴充套件路徑長度的狀態,然後對於每個點記錄路徑長度,最後取出第k小,很容易發現,我們擴充套件出了非常多無用的狀態,而且這種方法很可能會更新出第k+1短路,明顯是不需要的,這時候我們就需要乙個新演算法:a*演算法。

a*演算法呢,沒學過的請先自行移步補腦,我們可以減去非常多無用的狀態,而且因為估價函式的存在和可更新性,我們就可以實現從最短路不斷找到k短路的過程了,首先我們將整個圖反向建邊,用spfa求出每個點i,到點n的最短路(為了保證估價函式的正確性),然後呢我們設a*演算法中的估價函式為:f(j) = g(i)[已經走過路徑長度] + dis(j)[點j到n的最短路徑] + len(i,j)[這條邊的長度]; 因為我們每次都需要取乙個最小值來更新,可以使用優先佇列等等來維護估價函式,而且為了使路徑不重複,我們每一次更新完都需要pop掉最小值來更新第i+1短路。

對於a*中估價函式的求值我們就是搭配上bfs來解題了,演算法複雜度比較玄學啊。 o(

klog

n)到 o(

nk) 之間吧。

**:

# include

# include

# include

# include

using

namespace

std;

const

int n = 2e5 + 10;

struct node1

e[n],e1[n];

struct node

};int ins[n],st[n],st1[n],dis[n];

int n,m,k,i,tot,ans;

void add(int u,int v,int len)

void spfa()}}

q.pop();ins[rt]--;

}}int selectk()

for (int i = st1[rt.x];i;i = e1[i].nex)

}return0;}

int main()

spfa();

ans = selectk();

printf("%d",ans);

return

0;}

凸包學習筆記

凸包 凸包 convex hull 是乙個計算幾何 圖形學 中的概念。在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。x的凸包可以用x內所有點 x1,xn 的線性組合來構造.在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。用不嚴謹的話來講,給定二維平面上...

學習筆記 凸包

想學斜率優化,先把先決條件凸包給肝了。然後完全不懂,於是就咕了。順便看了一下線代 其實並不會 講真這東西耗了我半個暑假 20210305更新 po學了向量回來了發現這寫的什麼玩意,已更新完畢,您可從更新部分跳至凸包部分。同時,原 前置知識 叉積 部分已棄用並放置於最後。目錄更新 以下內容大部分在人教...

熱更新學習筆記(三)

熱更新學習筆記 三 之 luainte ce學習 1.c 與 lua如何互相呼叫?c 與lua互相呼叫的通訊,我們的通訊是通過什麼完成呢?就是 luainte ce,這是乙個開源的專案。2.什麼是luainte ce?luainte ce它包含兩個非常核心的庫,乙個是 luainte ce.dll,...