DP 最小覆蓋問題

2022-05-12 03:52:02 字數 747 閱讀 9469

原題:

找最低沒被覆蓋到的點,並在它的祖父處設乙個消防站。考慮到這個點的所有子孫後代都已經被覆蓋了,因此這時覆蓋祖父能蓋到更多額外的點,並保證結果不會更差。

很多思路是用dfs或堆求取最低節點,實際上沒必要,只要預處理出深度(邊輸入邊處理)並排序,碰到已覆蓋就跳過,未覆蓋就在祖父處設消防站,ans++。

問題在於怎樣才能判斷這個點覆蓋到了沒有。對於兒子或孫子覆蓋他,可以在在兒子處設站時就標記它;而對於父親和祖父覆蓋他,可以用兒子對父親的對映f來解決;問題在於兄弟。其實,可以用o陣列維護「離i最近的消防站到i的距離」,當o[父親]==1時,就能確定它是否被覆蓋。

**

#include#include#include#define n 2020

#define for(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

int n,b[n],f[n],d[n],o[n],ans,u,v,w;

bool cmp(int x,int y)

int main()

}printf("%d",ans);

}

這種方法的普適性很強,可以解決半徑為k的最小覆蓋問題。而且不用存圖。只需要把維護「父親和爺爺」改成維護「上位k位祖先」即可,複雜度o(n*k),常數也很小。

最小覆蓋問題

acm模版 最小路徑覆蓋o n 3 路徑覆蓋 就是在圖中找一些路經,使之覆蓋了圖中的所有頂點,且任何乙個頂點有且只有一條路徑與之關聯。最小路徑覆蓋 就是找出最少的路徑條數,使之成為p的乙個路徑覆蓋。路徑覆蓋與二分圖匹配的關係 最小路徑覆蓋 p 最大匹配數 其中最大匹配數的求法是把p中的每個頂點pi分...

最小圓覆蓋問題

最小圓覆蓋問題 乙個很經典的問題。題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。首先,我們可以從乙個空集r開始,不斷把平面上的點加入到r中,同時維護r的外接圓最小,就可以得到乙個簡單的解法。另外一種想法是,先任意選取兩個點,以這兩個點的連線為直徑作圓。再以此判斷剩餘的點,看它們是否...

最小路徑覆蓋問題(最小路徑覆蓋)

本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...