华师一附中OI组
标题: P2279 [HNOI2003]消防局的设立 [打印本页]
作者: 南望山 时间: 2018-10-28 09:35
标题: P2279 [HNOI2003]消防局的设立
本帖最后由 南望山 于 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。
输出文件
输出文件仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。
作者: 南望山 时间: 2018-10-28 09:36
本帖最后由 南望山 于 2018-10-28 09:37 编辑
- ///LG2279
- ///n^2
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- using namespace std;
- const int mn=1100;
- vector<int> a[mn];
- int n;
- int fa[mn];
- int deep[mn];
- int ans=0;
- bool vis[mn];
- void dfs(int now,int d)
- {
- vis[now]=1;
- if(d==0)
- return ;
- for(int i=0; i<=a[now].size()-1; i++) //sons
- dfs(a[now][i],d-1);
- dfs(fa[now],d-1);//father
- }
- int main()
- {
- cin>>n;
- fa[1]=1;
- deep[1]=1;
- for(int i=2; i<=n; i++)
- {
- int temp;
- cin>>temp;
- a[temp].push_back(i);//son
- fa[i]=temp;//father
- }
- for(int i=1; i<=n; i++)
- {
- deep[i]=deep[fa[i]]+1;
- }
- memset(vis,0,sizeof(vis));
- while(1)
- {
- int t=0;
- for(int i=1; i<=n; i++)
- if(deep[i]>deep[t]&&vis[i]==0)
- t=i;
- if(t==0)
- break;
- vis[t]=1;
- dfs(fa[fa[t]],2);//Ôڴ˽¨Õ¾
- ans++;
- }
- cout<<ans;
- return 0;
- }
复制代码 这样为什么会RE
欢迎光临 华师一附中OI组 (http://hsyit.cn/) |
Powered by Discuz! X3.2 |