秋季集訓第2周訓練筆記

2021-09-27 08:55:31 字數 1413 閱讀 7196

1.二維陣列鄰接矩陣儲存

鄰接矩陣的參考程式段

#include

using

namespace std;

int i,j,k,e,n;

double g[

101]

[101];

double w;

intmain()

…………

return0;

}

初始化陣列大可不必使用兩重for迴圈。

如果是int陣列,採用memset(g, 0x7f, sizeof(g))可全部初始化為乙個很大的數(略小於0x7fffffff),使用memset(g, 0, sizeof(g)),全部清為0,使用memset(g, 0xaf, sizeof(g)),全部初始化為乙個很小的數。

如果是double陣列,採用memset(g,127,sizeof(g));可全部初始化為乙個很大的數1.38*10306,使用memset(g, 0, sizeof(g))全部清 為0.

圖的鄰接表儲存法,又叫鏈式儲存法。本來是要採用鍊錶實現的,但大多數情況下 只要用陣列模擬即可。

兩種情況要具體而用

(一)深度優先與廣度優先遍歷

從圖中某一頂點出發系統地訪問圖中所有頂點,使每個頂點恰好被訪問一次,這種 運算操作被稱為圖的遍歷。為了避免重複訪問某個頂點,可以設乙個標誌陣列visited[i], 未訪問時值為false,訪問一次後就改為true。 圖的遍歷分為深度優先遍歷和廣度優先遍歷兩種方法,兩者的時間效率都是o(n*n)。

深度優先遍歷

深度優先遍歷與深搜dfs相似,從乙個點a出發,將這個點標為已訪問 visited[i]:=true;,然後再訪問所有與之相連,且未被訪問過的點。當a的所有鄰接點都被 訪問過後,再退回到a的上乙個點(假設是b),再從b的另乙個未被訪問的鄰接點出發, 繼續遍歷。

廣度優先遍歷

廣度優先遍歷並不常用,從程式設計複雜度的角度考慮,通常採用的是深度優先遍歷。 廣度優先遍歷和廣搜bfs相似,因此使用廣度優先遍歷一張圖並不需要掌握什麼新的 知識,在原有的廣度優先搜尋的基礎上,做一點小小的修改,就成了廣度優先遍歷演算法。

如果乙個圖存在一筆畫,則一筆畫的路徑叫做尤拉路,如果最後又回到起點,那這 個路徑叫做尤拉迴路。 我們定義奇點是指跟這個點相連的邊數目有奇數個的點。對於能夠一筆畫的圖,我 們有以下兩個定理。 定理1:存在尤拉路的條件:圖是連通的,有且只有2個奇點。 定理2:存在尤拉迴路的條件:圖是連通的,有0個奇點。 兩個定理的正確性是顯而易見的,既然每條邊都要經過一次,那麼對於尤拉路,除 了起點和終點外,每個點如果進入了一次,顯然一定要出去一次,顯然是偶點。對於歐 拉迴路,每個點進入和出去次數一定都是相等的,顯然沒有奇點。 求尤拉路的演算法很簡單,使用深度優先遍歷即可。 根據一筆畫的兩個定理,如果尋找尤拉迴路,對任意乙個點執行深度優先遍歷;找 尤拉路,則對乙個奇點執行dfs,時間複雜度為o(m+n),m為邊數,n是點數。

週中訓練筆記

rand 函式 rand n 範圍 0 n 1 n rand m n 1 範圍n m 線段樹的概括 1.是乙個完全二叉樹 2.主要用於解決解決連續區間的動態查詢問題 現在對於線段樹的認識還很侷限,所以概括的也非常籠統,接下來的幾天會繼續研究線段樹的。然後就是今天的廣西邀請賽重現賽的題 今天因為下午有...

週中訓練筆記(四)

線段樹總結 線段樹儲存的是區間的資訊然後在可以進行區間的各種操作。對於節點a n 它的左兒子為a 2 n 右兒子為a 2 n 1 假如這個節點所表示的區間為 1,5 那麼它左兒子表示的區間為 1,3 右兒子表示的區間為 4,5 公式為mid l r 2,左兒子表示的區間為 l,mid 右兒子表示的區...

週中訓練筆記11 線段樹總結

線段樹專題接近尾聲了,是時候總結一波了,說來慚愧,線段樹專題差不多都是參照題解才做出來的,雖然知道是套模板但是具體細節真的很拿人啊。主要總結一下線段樹的模板吧,題目的 實現都要以模板為框架構造 首先提出乙個問題 給你n個數,有兩種操作 1 給第i個數的值增加x 2 詢問區間 a,b 的總和是什麼?輸...