日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HNOI2003]消防局的设立(贪心)

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HNOI2003]消防局的设立(贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:https://ac.nowcoder.com/acm/problem/20031
來源:??途W

題目描述
2020年,人類在火星上建立了一個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n-1條道路來連接這些基地,并且每兩個基地都能夠通過道路到達,所以所有的基地形成了一個巨大的樹狀結構。如果基地A到基地B至少要經過d條道路的話,我們稱基地A到基地B的距離為d。
由于火星上非常干燥,經常引發火災,人類決定在火星上修建若干個消防局。消防局只能修建在基地里,每個消防局有能力撲滅與它距離不超過2的基地的火災。你的任務是計算至少要修建多少個消防局才能夠確?;鹦巧纤械幕卦诎l生火災時,消防隊有能力及時撲滅火災。
輸入描述:
輸入文件的第一行為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];//按著深度由大到小排序 } /*-------------dfs------------*/ 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;//設置虛父節點,要求出0的父親節點還有祖父節點,否則會出錯。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]消防局的设立(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。