洛谷P1807 bfs最長路 做題筆記

2021-10-10 07:06:18 字數 1649 閱讀 3515

**如下:

#include

#include

#include

#include

#include

#include

using namespace std;

#define pub push_back

#define pob pop_back

#define n 100005

vector<

int>a[n]

;queue<

int>q;

int value[

1505][

1505];

long

long d[n]

;bool color[n]

;int

main()

d[1]=

0;q.push(1

);while

(!q.

empty()

)}} cout<

}

關於此題,需要指出幾個知識點盲區和思維漏洞。

1.1 關於memset函式的使用

在之前我聊過如何用memst函式來清空陣列,這裡,我學會如何用memset函式賦予極大值。

固定模板:

memset

(s,0x3f

,sizeof()

);

這個0x3f和二進位制的計算有關,具體我不深入,只用記住0x3f可以用於賦予最大值就行。

其次是關於memset的使用標頭檔案應該是

#include

如果寫成:

#include

就會報錯。

實際上這兩個標頭檔案是兩個完全不同的標頭檔案,cstring和c語言中的string.h相一致,而string的標頭檔案是要用string型別才使用的,這個我在之前提到過。

2.1 對ac**的解析

value[t]

[ans]

=max

(value[t]

[ans]

,v);

value[ans]

[t]=

max(value[t]

[ans]

,v);

對於此題我最大的疑惑是為什麼要用max來確定最長路徑,兩點之間的距離不應該是固定的嗎?實際上,在做這些最長(最短)路徑的問題時,一定要考慮條條大路通羅馬的問題。即兩點之間可以有很多條路,而我們只用取其中最大或最小的就可以。

再者就是兩點之間距離的表示方法,一開始我定義的是一維陣列(**的思維 ),這樣寫不能用於表示兩點的距離。所以二維陣列是乙個完美的選擇,但是如果資料多到1e5就不能用二維陣列表示了。

if

(d[y]

[y]+d[ans]

)

這裡是乙個加速的環節,初解我是這樣寫的:

q.

push

(y);

d[y]

=max

(d[y]

,value[ans]

[y]+d[ans]

);

這樣寫會導致超時。

洛谷 P1807最長路

設g為有n個頂點的有向無環圖,g中各頂點的編號為1到n,且當為g中的一條邊時有i j。設w i,j 為邊的長度,請設計演算法,計算圖g中 1,n 間的最長路徑。輸入格式 輸入檔案longest.in的第一行有兩個整數n和m,表示有n個頂點和m條邊,接下來m行中每行輸入3個整數a,b,v 表示從a點到...

洛谷 P1807 最長路(拓撲排序)

題目大意 n個頂點的帶權有向無環圖,邊權可能為負值,求1到n的最長路,無法到達則輸出 1思路 拓撲排序,直接先將入度為0的入隊,定義dis陣列,先全部設定成乙個極小值,dis i 為i號頂點到1的距離,然後拓撲排序過程中更新dis,若最後dis n 仍為極小值輸出 1,否則輸出dis n inclu...

洛谷 P1807 最大路

這是一道拓撲的水題,emmm 求圖中的最長路 原題戳顯然可以用最短路寫,顯然,也可以用拓撲排序寫 top是正宗!這裡只給出拓撲排序的做法 因為是求從1到n的最大路,所以只有1能到的點才能更新,所以需要乙個標記陣列,儲存被誰更新,被1更新過就可以去更新其他點 乙個點的最大路 max 如下 by ace...