P2279 HNOI2003 消防局的設立

2021-08-07 03:27:36 字數 1896 閱讀 7253

//p2279 [hnoi2003]消防局的設立

//寫得不錯

//寫得也可以

//樹形動規的寫法,沒人指導,確實看不懂,無奈,找能看懂得來研究。

//此文做法,摘抄如下:

//乙個簡單的貪心, 我們只要考慮2個消防局設立的距離為5時是最好的, 因為利用最充分. 就dfs一遍, 再對根處理一下就可以了. 這道題應該是sgu某道題的簡化版...這道題距離只有2, 樹型dp應該也是可以的

//思路,摘抄如下:

//思路:考慮到 乙個消防局可以撲滅與他距離 <= 2 的所有點。那麼我們每隔4個點放乙個消防局是最優的。

//在 dfs 中:我們用陣列 f 標記每個點 某種程度上可以說 abs(f[x]-5) 就是 x 到消防局的距離。當 f[x] == 5 時 那我們另 f[x] == 0 即,把這個看為乙個消防局 ans ++;

//還有乙個地方就是處理一下邊界,即開始的點,如果走到了這裡而這裡距離最近的消防局的距離大於等於3,也就是這裡沒有被消防局覆蓋,那就只能在這裡也加上乙個消防局了。

//**寫得不錯

//注釋寫得不錯

//很無奈,最容易理解的,**比較長,程式還是按好理解的來寫,摘抄如下:

//首先,該題樹形dp可解,但是這裡介紹貪心的做法。

//顯然,對於目前深度最深的點,如果他的父親、爺爺、他父親的兒子和它自己上沒有建消防局,那麼該點不可能被覆蓋。而在這些點中,講消防局建在爺爺節點收益最大,因為爺爺節點建消防局覆蓋的範圍一定包括父親結點與該節點發親的兒子建消防局的範圍。

//這樣,我們按照深度把所有結點排一下序,然後每次重複在最深的節點的爺爺節點上建立消防局即可。

//為了更好的理解該題程式,編寫了幾組樣例資料,並配圖

//樣例1:

配圖:輸入:

612345

輸出:

2
//樣例2

//配圖:

//輸入: 4

1 11

//輸出: 1

//樣例3:

//配圖:

//輸入: 16

1223

3445

5667

788

//輸出: 2

//編寫測試資料過程中,深深的感覺到,該題的最小深度是以節點1為根節點的樹。

//編寫程式一蹴而就,2017-8-22 21:30 ac

//樹,圖,(深度優先遍歷)是少不了的。

#include

#include

#include

using namespace std;

int head[1000+10],cnt=0,father[1000+10],vis[1000+10],ans=0;//father[x]節點x的父節點

struct node1q[1000+10];

struct node2e[1000*2+10];//正向邊,反向邊

void addedge(int u,int v)

int cmp(node1 a,node1 b)

void deep(int x,int f)

}void station(int x,int c)

int main()

deep(1,0);

sort(q+1,q+n+1,cmp);//按深度,由大到小進行排序

for(i=1;i<=n;i++)

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

return 0;

}

P2279 HNOI2003 消防局的設立

2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...

P2279 HNOI2003 消防局的設立

本來看著像是樹狀dp,但是狀態好麻煩。所以可以用貪心。這個思想一開始想到了,奈何 能力不夠。所以借鑑了一下洛谷上的思路。1.用d i 儲存深度,b i 來代表節點值。然後這個cmp函式來排列b i 即實現了b i 代表第i深的節點值 2.用o i 來儲存到這個節點最近的消防局距離。f i 代表父節點...

P2279 HNOI2003 消防局的設立

之前拿dp寫過一次。炸了。但就一直爛在 了。昨天同學胡策。出到了一部分。說使用貪心做。時間複雜度是 o nk 的。其中k是半徑。然後就學習了一波。當然這道題是只考慮點支配 差不多 感覺這個貪心很妙 大體就是按照深度,處理出多少級祖先來,然後貪心。include include include inc...