P4268 [USACO18FEB] Directory Traversal G

题目描述

奶牛 Bessie 出人意料地精通计算机。她在谷仓的电脑上将所有珍贵文件存储在一系列目录中;例如:

复制代码
bessie/
  folder1/
    file1
    folder2/
      file2
  folder3/
    file3
  file4

有一个单一的"顶级"目录,名为 bessie

Bessie 可以导航到她想要的任何目录。从给定目录中,任何文件都可以通过"相对路径"引用。在相对路径中,符号 .. 表示父目录。如果 Bessie 在 folder2 中,她可以通过以下方式引用四个文件:

复制代码
../file1
file2
../../folder3/file3
../../file4

Bessie 希望选择一个目录,使得从该目录到所有文件的相对路径长度之和最小。

输入格式

第一行包含一个整数 N(2≤N≤100,000),表示文件和目录的总数。为了输入方便,每个对象(文件或目录)被分配一个唯一的整数 ID,范围在 1 到 N 之间,其中 ID 1 表示顶级目录。

接下来是 N 行。每行以文件或目录的名称开头。名称仅包含小写字母 a-z 和数字 0-9,且长度最多为 16 个字符。名称后是一个整数 m。如果 m 为 0,则该实体是一个文件。如果 m>0,则该实体是一个目录,并且它内部共有 m 个文件或目录。在 m 之后是 m 个整数,表示该目录中实体的 ID。

输出格式

输出所有文件的相对路径长度的最小可能总和。请注意,此值可能超过 32 位整数的范围。

显示翻译

题意翻译

输入输出样例

输入 #1

复制代码
8
bessie 3 2 6 8
folder1 2 3 4
file1 0
folder2 1 5
file2 0
folder3 1 7
file3 0
file4 0

输出 #1

复制代码
42

说明/提示

此输入描述了上面给出的示例目录结构。

最佳解决方案是位于 folder1 中。从该目录中,相对路径为:

复制代码
file1
folder2/file2
../folder3/file3
../file4

题目来源:Mark Gordon

参考代码:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int tot,m,s[N],n,h[N*2],to[N*2],ne[N*2],dp[N],num[N],js,ans;
void add(int a,int b)
{
	tot++;
	ne[tot]=h[a];
	h[a]=tot;
	to[tot]=b;
}
void dfs1(int y,int fa)
{
	int j1=0;
	for(int i=h[y];i;i=ne[i])
	{
		int j=to[i];
		if(j==fa)continue;
		j1++;
		dfs1(j,y);
		num[y]+=num[j];
		dp[y]+=dp[j]+s[j]*num[j]+num[j];
	}
	if(!j1)
	{
		js++;
		num[y]=1;
	}
}
void dfs2(int y,int fa)
{
	for(int i=h[y];i;i=ne[i])
	{
		int j=to[i];
		if(j==fa)continue;
		dp[j]=(js-num[j])*3+dp[y]-(num[j])*s[j]-num[j];
		ans=min(ans,dp[j]-js);
		dfs2(j,y);
	}
}
signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n;
	int a,b;
	string str;
	for(int i=1;i<=n;i++)
	{
		cin>>str;
		s[i]=str.size();
		cin>>m;
		for(int j=1;j<=m;j++)
		{
			cin>>a;
			add(a,i);
			add(i,a);
		}
	}

	dfs1(1,0);	
	ans=dp[1]-js;
	dfs2(1,0);
	cout<<ans;
	return 0;
}
相关推荐
long31610 小时前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
进击的小头10 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频
欧阳x天10 小时前
STL详解(九)—— stack和queue的模拟实现
开发语言·c++
xqqxqxxq10 小时前
洛谷算法1-1 模拟与高精度(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
razelan10 小时前
初级算法技巧 4
算法
砍树+c+v10 小时前
3a 感知机训练过程示例(手算拆解,代码实现)
人工智能·算法·机器学习
zy_destiny10 小时前
【工业场景】用YOLOv26实现4种输电线隐患检测
人工智能·深度学习·算法·yolo·机器学习·计算机视觉·输电线隐患识别
智驱力人工智能10 小时前
货车违规变道检测 高速公路安全治理的工程实践 货车变道检测 高速公路货车违规变道抓拍系统 城市快速路货车压实线识别方案
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
罗湖老棍子10 小时前
【例9.18】合并石子(信息学奥赛一本通- P1274)从暴搜到区间 DP:石子合并的四种写法
算法·动态规划·区间dp·区间动态规划
dgaf10 小时前
【疯狂的往左】用 C 语言播放《下山》
c语言·c++