华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1129|回复: 1
打印 上一主题 下一主题

P2279 [HNOI2003]消防局的设立

[复制链接]

4

主题

6

帖子

58

积分

华一学生

积分
58
跳转到指定楼层
楼主
发表于 2018-10-28 09:35:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 南望山 于 2018-10-28 09:40 编辑

https://www.luogu.org/problemnew/show/P2279
题目描述
2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。
由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。
你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾。

输入文件
输入文件的第一行为n (n<=1000),表示火星上基地的数目。接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a,表示从编号为i的基地到编号为a的基地之间有一条道路,为了更加简洁的描述树状结构的基地群,有a<i。


输出文件

输出文件仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。

输入样例#1:
612345



输出样例#1:
2






回复

使用道具 举报

4

主题

6

帖子

58

积分

华一学生

积分
58
沙发
 楼主| 发表于 2018-10-28 09:36:38 | 只看该作者
本帖最后由 南望山 于 2018-10-28 09:37 编辑
  1. ///LG2279
  2. ///n^2
  3. #include<iostream>
  4. #include<cstdio>
  5. #include<vector>
  6. #include<cstring>
  7. using namespace std;
  8. const int mn=1100;
  9. vector<int> a[mn];
  10. int n;
  11. int fa[mn];
  12. int deep[mn];
  13. int ans=0;
  14. bool vis[mn];
  15. void dfs(int now,int d)
  16. {
  17.     vis[now]=1;
  18.     if(d==0)
  19.         return ;
  20.     for(int i=0; i<=a[now].size()-1; i++) //sons
  21.         dfs(a[now][i],d-1);
  22.     dfs(fa[now],d-1);//father
  23. }
  24. int main()
  25. {
  26.     cin>>n;
  27.     fa[1]=1;
  28.     deep[1]=1;
  29.     for(int i=2; i<=n; i++)
  30.     {
  31.         int temp;
  32.         cin>>temp;
  33.         a[temp].push_back(i);//son
  34.         fa[i]=temp;//father
  35.     }
  36.     for(int i=1; i<=n; i++)
  37.     {
  38.         deep[i]=deep[fa[i]]+1;
  39.     }
  40.     memset(vis,0,sizeof(vis));
  41.     while(1)
  42.     {
  43.         int t=0;
  44.         for(int i=1; i<=n; i++)
  45.             if(deep[i]>deep[t]&&vis[i]==0)
  46.                 t=i;
  47.         if(t==0)
  48.             break;
  49.         vis[t]=1;
  50.         dfs(fa[fa[t]],2);//&Ocirc;&Uacute;&acute;&Euml;&frac12;¨&Otilde;&frac34;
  51.         ans++;
  52.     }
  53.     cout<<ans;
  54.     return 0;
  55. }
复制代码
这样为什么会RE
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:32 , Processed in 0.100394 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表