[GDOIpj222B] 网页浏览
第二题 网页浏览
提交文件: webpage.cpp
输入文件: webpage.in
输出文件: webpage.out
时间空间限制: 1 秒, 256 MB
我们在上网时,从一个网页上的链接打开另一个网页有两种方式,一个是直接替换正在浏览的页面,另
一个是在新标签页中打开。如果善用这两种打开方式,是可以节省一些操作的。
今天 Zayin 需要浏览 n 个网页,其中有且仅有一个网页是保存在本地可以点击打开的,其他 n − 1 个网
页都是需要从某个页面的链接里打开的。因此,这 n 个网页的链接关系可以用一棵 n 个节点的有根树表示。
一开始,浏览器里什么标签页也没有,Zayin 可以点击根节点代表的网页,打开第一个标签页,接下来,
Zayin 可以做如下的事情:
• 从当前浏览的网页所含有的链接里选择一个打开,直接替换当前的网页;
• 从当前浏览的网页所含有的链接里选择一个,在新标签页中打开;
• 点击“返回”,当前网页返回被其替换的网页,该操作只能用于“替换打开”的网页;
• 关闭当前网页。
Zayin 可以自行决定浏览顺序。求 Zayin 从空浏览器开始,到最后浏览完全部 n 个网页并全部关闭回到
空浏览器的状态,最少需要多少步操作。
输入格式
第一行一个整数 n,表示需要浏览的网页的数量。
第二行 n 个整数,第 i 个整数 fi 表示第 i 个网页是从哪个网页跳转过来的,如果 fi = −1 则表示该网
页是根网页,需要在初始时点击打开。
输出格式
一行,一个整数,表示最少的操作步数。
样例数据
5
-1 1 2 1 4
7
样例解释
步骤 操作 浏览器拥有的页面
1 点击打开 1 号网页 1
2 从 1 号网页新标签页打开 2 号网页 1, 2
3 从 2 号网页替换打开 3 号网页 1, 3
4 关闭 3 号网页 1
5 从 1 号网页替换打开 4 号网页 4
6 从 4 号网页替换打开 5 号网页 5
7 关闭 5 号网页 无
数据范围
对于所有测试点,\(1 ≤ n ≤ 10^5\)。
测试点 | \(n ≤\) | 特殊限制 |
---|---|---|
1 ∼ 3 | \(7\) | 无 |
4 | \(10^5\) | \(f_1 = −1\),其余$ f_i = i − 1$ |
5 | \(10^5\) | \(f_1 = −1\),其余$ f_i = 1$ |
6 ∼ 7 | \(10^5\) | 每个节点最多只有 5 个子节点 |
8 ∼ 10 | \(10^5\) | 无 |
首先我们每个网页需要打开一次,删除一次,貌似是两个操作。但是删除这个操作也可以变成打开一个新的标签页,只有叶子节点不能。所以答案为\(n\)加叶子节点的个数。
#include<cstdio>
const int N=1e5+5;
int a[N],f[N],n,cnt;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",f+i);
if(f[i]!=-1)
a[f[i]]=1;
}
for(int i=1;i<=n;i++)
if(!a[i])
++cnt;
printf("%d",cnt+n);
return 0;
}