演算法設計與分析基礎3 貪心演算法

2021-10-14 11:17:03 字數 2946 閱讀 6127

遞迴與分治演算法動態規劃貪心演算法回溯演算法貪心演算法的特徵是最優子結構性質和貪心選擇性質。

最優子結構性質:原問題的最優解包含著子問題的最優解。

貪心選擇性質:問題整體的最優解是通過一系列區域性的最優選擇得到的,這種選擇叫做貪心選擇。貪心選擇可以依賴於已經做過的選擇,但是絕對不會依賴於將來的選擇,也不依賴於子問題的解。

貪心選擇一般沒有乙個通用的框架。只要用數學歸納法證明貪心選擇性質(嚴謹),一般可以進行排序,或者維護乙個最大堆最小堆,運用並查集等等實現每部選擇都貪心。

//給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。

//請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1

#include

#include

#include

#include

using namespace std;

const int n

=510

;int g[n]

[n];

//儲存圖

int dist[n]

;//儲存最終結果

bool isvisited[n]

;//記錄是否訪問過該節點,初始均為0代表沒有訪問過

int n,m;

int dijkstra()

} isvisited[t]

=true

;for

(int j=

1;j<=n;j++)}

if(dist[n]

==0x3f3f3f3f

)return-1

;return dist[n];}

int main()

cout<<

dijkstra()

}

//個人認為最小生成樹是一種比較簡單的貪心演算法

//克魯斯卡爾就是比較簡單粗暴,每次都選最小的邊進行拼裝,只要不成為環就可以

//直觀上看就是眾樹合一

//一般處理稀疏圖

//這裡比較巧妙地運用了並查集的手段

//並查集這種陣列結構顧名思義,主要有合併和查詢兩個功能。

//並查集:每個集合用一顆樹來表示,樹根的編號是整個集合的編號,每個節點儲存他的父節點。

//例子: 1 2 3 4 元素編號

// p[1] p[2] p[3] p[4] 值

#include

#include

#include

#include

using namespace std;

const int n

=200010,m

=100010

;int p[n]

;//用作並查集

int n,m;

struct edge

}edges[n]

;int find

(int x)

//用來找祖宗 ,並查集的查詢功能,這裡的p可以代表parent的意思

int kruskal()

}if(count==n-1)

return res;

else

return

0x3f3f3f3f;}

int main()

for(int i=

0;i}sort

(edges,edges+m);

int res=

kruskal()

;if(res==

0x3f3f3f3f

) cout<<

"impossible"

}

//給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。

//請你求出最小生成樹,和dijkstra像,就是d是與源點的最小,prim是與已選集合的最小

#include

#include

#include

#include

using namespace std;

const int n

=510

;int g[n]

[n];

//儲存圖

int dist[n]

;//儲存最終結果

bool isvisited[n]

;//記錄是否訪問過該節點,初始均為0代表沒有訪問過

int n,m;

int prim()

}if(i && dist[t]

==0x3f3f3f3f

)return

0x3f3f3f3f;if

(i) res+=dist[t];

isvisited[t]

=true

;for

(int j=

1;j<=n;j++)}

return res;

}int main()

int t=

prim()

;if(t==

0x3f3f3f3f

) cout<<

"impossible"

;else cout

}

#include

#include

#include

#include

using namespace std;

int main()

int res=0;

while

(heap.

size()

>1)

cout

}

演算法設計與分析 貪心演算法

time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...

演算法設計與分析 貪心演算法

分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...

演算法設計與分析 貪心演算法

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型...