51nod 1274 最長遞增路徑

2021-08-19 03:24:04 字數 1449 閱讀 5278

1274 最長遞增路徑

codility

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

乙個無向圖,可能有自環,有重邊,每條邊有乙個邊權。你可以從任何點出發,任何點結束,可以經過同乙個點任意次。但是不能經過同一條邊2次,並且你走過的路必須滿足所有邊的權值嚴格單調遞增,求最長能經過多少條邊。

以此圖為例,最長的路徑是:

3 -> 1 -> 2 -> 3 -> 2 或

3 -> 1 -> 2 -> 3 -> 4 長度為4。

input

第1行:2個數n, m,n為節點的數量,m為邊的數量(1 <= n <= 50000, 0 <= m <= 50000)。節點編號為0 至 n - 1。

第2 - m + 1行:每行3個數s, e, w,表示從頂點s到頂點e,有一條權值為w的邊(0 <= s, e <= n - 1, 0 <= w <= 10^9)。

output

輸出最長路徑的長度。
input示例

6 8

0 1 4

1 2 3

1 3 2

2 3 5

3 4 6

4 5 6

5 0 8

3 2 7

output示例

4
sol:

按邊長從小到大排序之後,從前往後更新。按邊長長度成段更新,複雜度o(m)。

xjb記憶化搜尋果然t了

code:

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define fi first

#define se second

const int maxn = 5e4+5;

typedef long long ll;

const int mod = 1e9+7;

struct edge

};edge e[maxn];

int f[maxn];

int tmp[maxn];

int main()

sort(e+1,e+m+1);

int la=0;

for(int i=1;i<=m;i++)

for(int j=la+1;j<=i;j++)

la=i;}}

int ans=0;

for(int i=0;i

printf("%d\n",ans);

return 0;

}

51nod1274 最長遞增路徑

將邊排序後dp一下就可以了。include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define clr x,c ...

51nod 1274 最長遞增路徑(dp)

題目鏈結 定義dp i 走到頂點i的最長路徑。為了動態規劃的無後效性,得先把邊按權值排序。為了不讓頂點之間的dp值重複計算,得把上一次的dp值儲存下來。由於需要嚴格遞增,所以權值相同的邊用到的dp值是一樣的,所以可以一次把所有權值相同的邊一起加入圖里,然後更新答案。d p u m ax d p u ...

51nod 1274 最長遞增路徑(DP)

一開始自己想了一種跑的巨慢。寫了題解的做法又跑的巨快。一臉懵逼 顯然要求邊權遞增就不可能經過重複的邊了,那麼設f i 為第i條邊出發能走多遠就好了,這是我一開始的寫法,可能dfs冗餘狀態較多,跑的極慢 include include include include include include i...