生活随笔
收集整理的這篇文章主要介紹了
[HNOI2003]消防局的设立(贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:https://ac.nowcoder.com/acm/problem/20031
來源:牛客網
題目描述
2020年,人類在火星上建立了一個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連接這些基地,并且每兩個基地都能夠通過道路到達,所以所有的基地形成了一個巨大的樹狀結構。如果基地A到基地B至少要經過d條道路的話,我們稱基地A到基地B的距離為d。
由于火星上非常干燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地里,每個消防局有能力撲滅與它距離不超過2的基地的火災。你的任務是計算至少要修建多少個消防局才能夠確保火星上所有的基地在發生火災時,消防隊有能力及時撲滅火災。
輸入描述:
輸入文件的第一行為n,表示火星上基地的數目。
接下來的n-1行每行有一個正整數,其中文件第i行的正整數為a[i],表示從編號為i的基地到編號為a[i]的基地之間有一條道路,為了更加簡潔的描述樹狀結構的基地群,有a[i]
輸出描述:
輸出文件僅有一個正整數,表示至少要設立多少個消防局才有能力及時撲滅任何基地發生的火災。
示例1
輸入
復制
6
1
2
3
4
5
輸出
復制
2
這是在樹形dp環節見到的這個題目,但是樹形dp偷看了一下題解,有點小麻煩。。就換成貪心來做了。我們對于一條鏈上的節點來說,在葉子節點建立基地的效果一定沒有在他的祖父節點建立基地的效果好。因為他的祖父節點還可以往上惠澤上面的節點。這就是貪心的思想。我們dfs一遍出來的是各個節點的深度和他們各自的父親節點。按著深度排序,用剛才的想法去貪心求就可以了。
代碼如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std
;const int maxx
=1e5+100;
struct edge
{int to
,next
;
}e
[maxx
<<1];
int head
[maxx
<<1],fa
[maxx
],deep
[maxx
],a
[maxx
],dis
[maxx
];
int tot
,n
;
inline void init()
{memset(dis
,-1,sizeof(dis
));memset(head
,-1,sizeof(head
));tot
=0;
}
inline void add(int u
,int v
)
{e
[tot
].to
=v
,e
[tot
].next
=head
[u
],head
[u
]=tot
++;
}
inline bool cmp(int a
,int b
)
{return deep
[a
]>deep
[b
];
}
inline void dfs(int u
,int f
)
{deep
[u
]=deep
[f
]+1;fa
[u
]=f
;for(int i
=head
[u
];i
!=-1;i
=e
[i
].next
){int to
=e
[i
].to
;if(to
==f
) continue;dfs(to
,u
);}
}
inline int solve()
{int s
,f
,ff
,fff
,ffff
,ans
=0;for(int i
=1;i
<=n
;i
++) a
[i
]=i
;sort(a
+1,a
+1+n
,cmp
);fa
[0]=n
+1,fa
[fa
[0]]=n
+2;for(int i
=1;i
<=n
;i
++){s
=a
[i
];f
=fa
[s
];ff
=fa
[f
];fff
=fa
[ff
];ffff
=fa
[fff
];if(dis
[s
]>=0||dis
[f
]>=1||dis
[ff
]>=2) continue;ans
++;dis
[s
]=max(dis
[s
],0);dis
[f
]=max(dis
[f
],1);dis
[ff
]=max(dis
[ff
],2);dis
[fff
]=max(dis
[fff
],1);dis
[ffff
]=max(dis
[ffff
],0);}return ans
;
}
int main()
{int x
;while(~scanf("%d",&n
)){init();for(int i
=2;i
<=n
;i
++){scanf("%d",&x
);add(x
,i
),add(i
,x
);}deep
[0]=0;dfs(1,0);printf("%d\n",solve());}return 0;
}
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的[HNOI2003]消防局的设立(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。