演算法 貪心演算法與動態規劃演算法

2021-10-02 17:30:46 字數 3310 閱讀 7595

貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。

1 最小生成樹問題

題目概述

給定乙個有n

nn個點m

mm條邊的無向圖,圖中可能存在重邊和自環,邊權可能為負數。求最小生成樹的樹邊權重之和。

輸入格式

第一行輸入兩個整數n

nn和mmm;

接下來m

mm行,每行包含三個整數u

uu,v

vv,w

ww,表示點u

uu和點v

vv之間存在一條權值為w

ww的邊。

輸出格式

在一行中輸出最小生成樹的樹邊權重之和。若最小生成樹不存在,則輸出non-existent。

輸入樣例

4 445

550001

111110

002222

220003

333331

112222

222223

334

44輸出樣例

6

66

解決方法

prim演算法

定義集合vne

w,en

ew

v_,e_

vnew​,

enew

​表示頂點集與邊集,初始化vne

w=,e

new=

∅v_=\,e_=\varnothing

vnew​=

,ene

w​=∅

,其中v

vv為任意乙個頂點。在邊集e

ee中尋找權值最小的邊

v>

< u,v>

v>

,滿足條件u

uu是頂點集vne

wv_

vnew

​中的元素,而v

vv不是頂點集vne

wv_

vnew

​中的元素。重複上述步驟n−1

n-1n−

1次。時間複雜度:o(n

logn

)o(nlog n)

o(nlog

n)

const

int maxn =

100;

const

int inf =

1<<30;

intprim

(int n,

int g[

][maxn]

) selected[0]

=true

;int num =

0, ans =

0, v =0;

while

(num < n -1)

}}for(

int i =

0; i < n; i++)}

selected[v]

=true

; ans +

= min;

num++;}

return ans;

}

kruskal演算法

定義集合vne

w,en

ew

v_,e_

vnew​,

enew

​表示頂點集與邊集,初始化vne

w=v,

enew

=∅

v_=v,e_=\varnothing

vnew​=

v,en

ew​=

∅,將邊集e

ee中的元素按照遞增排序,若e

ee與ene

we_

enew

​中的邊不構成環,則將e

ee加入ene

we_

enew

​。重複上述步驟n−1

n-1n−

1次。時間複雜度:o(n

logn

)o(nlog n)

o(nlog

n)

const

int maxn =

1000

;struct edge

;edge e[maxn]

;int

find_root

(int x,

int parent)

return x_root;

}bool

union_vertices

(int x,

int y,

int parent,

int rank)

else

else

if(rank[y_root]

> rank[x_root]

)else

issuccess =

true;}

return issuccess;

}bool

cmp(edge a,edge b)

intkruskal

(int n,

int m, edge e)

while

(num < n -1)

}}return ans;

}

2 最短路徑問題

解決方法

dijskra演算法

時間複雜度:o(n

2)

o(n^2)

o(n2

)

void

dijskra

(int s,

int n,

int g[

][maxn]

,int dist)

visited[s]

=true

; dist[s]=0

;int num =

0, ans =

0, v =0;

while

(num < n -1)

}}for(

int i =

0; i < n; i++)}

visited[v]

=true

; num++;}

}

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

演算法 動態規劃演算法

背 包問題 有乙個揹包,容量為 4磅 現有如下物品 物品 重量 吉他 g 1 1500 音響 s 4 3000 電腦 l 3 2000 1 要求達到的目標為裝入的揹包的總價值最大,並且重量不超出 2 要求裝入的物品不能重複 動態規劃的核心思想是把原來的問題分解成子問題進行求解,也就是分治的思想。但是...