ACM近期之學習總結

2021-09-19 23:45:55 字數 2902 閱讀 8334

先說一下這幾天的學習情況吧。這幾天雖然vjudge上的題目不能提交啦,但是還是要以前沒有看過的題補一遍。其中,做了幾道dfs和bfs的題目,還看了幾道bfs+bit位運算結合,以及full tank(最短路徑+dp)最短路徑變形的問題。我感覺這兩個知識點掌握的不是很好,只是略懂皮毛,沒有理解的很透徹,能夠達到熟練應用到解決問題的地步,所以接下來幾天要把這些問題盡可能消化吸收。

一.演算法目的這個演算法所求的是單源最短路徑,好比說你寫好了dijkstra的函式,那麼只要輸入點a的編號,就可算出圖上每個點到這個點的距離。

時間複雜度是o(n²)

二. 演算法詳解給你乙個無向圖。

5 6(5代表5個點,6代表5個點構成的6個臨邊)

dijkstra 演算法的步驟如下

1、當到乙個時間點時,圖上部分的點的最短距離已確定,部分點的最短距離未確定。

2、選乙個所有未確定點中離源點最近的點,把他認為成最短距離。

3、再把這個點所有出邊遍歷一邊,更新所有的點。

注:此處以下地方不明白,以後要繼續學習

寫此**的大致思路為:首先用鄰接表實現dijkstra,但是這個演算法有乙個壞處,就是出現負權邊,這個演算法就炸了,要解決負權邊,就要用到spfa。

由於樸素的dijkstra時間複雜度是n^2,但是,如果經過堆優化,dijkstra的時間複雜度能達到nlogn,那麼堆優化怎麼優化?在這裡,我們可以用乙個優先佇列,每當搜尋到乙個新點,扔到優先佇列裡面,這樣每次就取隊首的絕對是最優值。這樣可以省去for迴圈。(現在不理解,只能硬性記住)

**

#include #include #include #include #include #include #include #define in(a) a=read()

#define rep(i,k,n) for(long long i=k;i<=n;i++)

#define maxn 10010

using namespace std;

typedef pairp;

inline long long read()

long long n,m,s;

long long total=0,head[maxn],nxt[maxn<<10],to[maxn<<10],val[maxn<<10];

long long dis[maxn],vis[maxn];

priority_queue ,greater> q;//優先佇列優化

inline void adl(long long a,long long b,long long c)

inline void dijkstra()

}return ;

}int main()

c++提供了6種位運算子來進行位運算操作:

&      按位與

|      按位或

^      按位異或

~      按位取反

<<     左移(左邊消失,右邊補0)

>>     右移(右邊消失,左邊補符號位)

位運算的運算元是整數型別或字元型.

兩個位同為1,結果才是1,否則為0。(如果是負數參與了運算,則負數以補碼形式參與所有位運算)

例如:6的二進位制是110,11的二進位制是1011,那麼6 & 11的結果就是2 

按位與運算(&)的用法:

& 常用於二進位製取位操作,例如乙個數 & 1的結果就是取二進位制的最末位。

參與運算的兩位只要有1個1則結果為1, 只有兩位均為0結果才是0。(  0|0=0    0|1=1    1|1=1  )

2|5 即 00000010 | 0000 0101 = 00000111  因此,3|5的值得7。 

按位或(|)運算用法:

|運算通常用於二進位制特定位上的強制置1,例如乙個數或 1的結果就是把二進位制最末位強行變成1。

參與運算的兩位如果相同則結果為0,參與運算的兩位如果不同則結果為1。(  0^0=0  0^1=1  1^1=0   )

a << b就表示把a轉為二進位制後左移b位(在後面添b個0)。

例如100的二進位制為1100100,而110010000轉成十進位制是400,那麼100 << 2 = 400。可以看出,a << b的值實際上就是a乘以2的b次方,因為在二進位制數後添乙個0就相當於該數乘以2。

左移《運算應用:

可以用《來定義maxn等常量。

a >> b表示二進位制右移b位(去掉末b位)

1.x = x >> 1等價於x = x / 2

2.x = x >> n等價於x = x / 2^n

當a是正整數時,a>>b等價於a/(2的b次方)

當a是負整數時,a>>b並不等價與a/(2的b次方),而是等於a/(2的b次方)上取整。

如a=-9

cout<>1); //輸出-5.

ACM之近期學習總結

1.定義 搜尋演算法是利用計算機的高效能來有目的地窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。2.相比於列舉演算法的優點 相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移 按照要求拓展 到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案...

ACM之近期學習總結

最近acm沒有學什麼新演算法,只是做了一些題,相當於補了一些以前掌握不好的知識點。接下來總結一下近期做題過程中所學。最近在洛谷上做了一道黑色星期五的問題,通過這道題我掌握了 i.為了方便用陣列儲存每月的天數,且月份符合實際意義,我們一般這樣定義陣列 int a 13 即將a 0 設為0,正常的a 1...

學習總結 近期acm學習的總結

開學已經乙個月了,對acm的學習也乙個月了,做了一下總結 對自己不好的地方的反省 1.開學一開始學的是stl,不得不說stl是乙個很好的東西,熟練的運用stl大大的減少了 量,也使演算法容易實現。但是我在用stl後使自己產生了一種惰性思維。在兩個星期的stl練習後,我發現自己變得越來越懶,不願意自己...