首页 > 其他分享 >[JSOI2014]支线剧情2

[JSOI2014]支线剧情2

时间:2022-12-14 21:47:46浏览次数:75  
标签:sz JSOI2014 int 存档 1000001 支线 剧情 edge 节点

链接:https://vjudge.net/problem/HYSBZ-5031

题目描述:给定一个树形图,规定一号点为根节点。到达一个点时可以进行下列操作:

\(1\).沿着一条有向边走到下一个节点。

\(2\).回到\(1\)号节点。

\(3\).设定当前节点为存档节点。

\(4\).回到存档节点。

求遍历完所有点走过的边权和的最小值。

题解:可以发现,每一个点,假如它的祖先中没有被存档的,那么将它存档不会使答案更差。所以对于当前子树,我们要尽量的让他存档。

令\(dp_{x}\)表示\(x\)存档时遍历完\(x\)的子树的最小代价。

则有两种情况:

\(1\).选择\(x\)存档并且\(x\)的子树中除了\(x\)都不存档。

\(2\).选择一个子节点\(v\),在遍历完\(x\)的其他子节点的子树后,将存档节点流放至\(v\)。

\(1\)操作很好做,答案就是\(f_{x}\)(在下面的表述中,\(f\)表示\(x\)所有叶节点到\(x\)的距离和,\(sz_{x}\)表示\(x\)的叶结点的个数),可以直接\(dp\)。

\(2\)操作也很好做,假如你选了子节点\(v\),则对答案的贡献是\(d_{v}+dp_{v}-(f_{v}+sz_{v}+edge)\),选贡献小于\(0\)的选即可。当然,你选的第一个无需\(d_{v}\)的代价,由于你选的第一个一定是贡献尽量小的,所以判一下就行了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
	int data,v,nxt;
};
node edge[1000001];
int head[1000001],len;
bool used[1000001];
long long n,length,fa[1000001],top[1000001],d[1000001],D[1000001],sz[1000001],dp[1000001];
void add(int x,int y,int z)
{
	edge[++len].v=y;
	edge[len].data=z;
	edge[len].nxt=head[x];
	head[x]=len;
	return;
}
void dfs(int x)
{
	used[x]=1;
	if (head[x]==0)
		sz[x]=1;
	for (int i=head[x];i>0;i=edge[i].nxt)
		if (!used[edge[i].v])
		{
			d[edge[i].v]=d[x]+edge[i].data;
			dfs(edge[i].v);
			fa[edge[i].v]=x;
			D[x]+=(D[edge[i].v]+edge[i].data*sz[edge[i].v]);
			dp[x]=D[x];
			sz[x]+=sz[edge[i].v];
		}
	length=0;
	for (int i=head[x];i>0;i=edge[i].nxt)
		if (fa[edge[i].v]==x)
			top[++length]=dp[edge[i].v]+edge[i].data-(D[edge[i].v]+edge[i].data*sz[edge[i].v]);
	sort(top+1,top+length+1);
	for (int i=1;i<=length;++i)
		dp[x]+=min(top[i]+d[x]*(i!=1),0ll);
	return;
}
int main()
{
	long long x,y,z;
	cin>>n;
	for (int i=1;i<=n;++i)
	{
		cin>>x;
		while (x--)
		{
			cin>>y>>z;
			add(i,y,z);
		}
	}
	dfs(1);
	cout<<dp[1]<<endl;
	return 0;
}

标签:sz,JSOI2014,int,存档,1000001,支线,剧情,edge,节点
From: https://www.cnblogs.com/zhouhuanyi/p/16983660.html

相关文章

  • [AHOI2014/JSOI2014]拼图
    链接:https://www.luogu.com.cn/problem/P4039题目描述:有一些长为\(n\),宽为\(w_{i}\)的黑白色矩形,要将它们拼成一个\(n\timesm\)的大矩形,求大矩形中最大的全白子矩形的面......
  • [AHOI2014/JSOI2014]支线剧情
    链接:https://www.luogu.com.cn/problem/P4044题目描述:给定一个$DAG$,求若干条条路径,覆盖所有的点,并最小化路径的权值和。题解:由于图是一个$DAG$,所以原问题可以转化为,......
  • [AHOI2014/JSOI2014]奇怪的计算器
    链接:https://www.luogu.com.cn/problem/P4041题目描述:给定一个数列$a$,与常数$L$,$R$,实现下列四个操作:1.将所有数加$d$。2.将所有数减$d$。3.将所有数乘$d$。4.......
  • [AHOI2014/JSOI2014]拼图
    链接:https://www.luogu.com.cn/problem/P4039题目描述:有一些长为$n$,宽为$w_{i}$的黑白色矩形,要将它们拼成一个$n\timesm$的大矩形,求大矩形中最大的全白子矩形的面积的......
  • [JSOI2014]支线剧情2
    链接:https://vjudge.net/problem/HYSBZ-5031题目描述:给定一个树形图,规定一号点为根节点。到达一个点时可以进行下列操作:$1$.沿着一条有向边走到下一个节点。$2$.回到......
  • [AHOI2014/JSOI2014]骑士游戏
    链接:https://www.luogu.com.cn/problem/P4042题目描述:对于一个怪物$i$,可以花费$c_{i}$的代价将其变为一个怪物集合,或花费$c2_{i}$的代价消灭他。求消灭怪物$1$的最小代......
  • 视效剧情口碑双爆棚!Netflix 现象级剧集《怪奇物语》第四季神级视效专访大揭秘!
    刷新Netflix收视记录的超火剧集《怪奇物语》(StrangerThings)第四季视效剧情口碑双爆棚,无疑是2022年最值得一看的现象级剧集之一。第四季共九集,分上下两部,分别在今年5月......
  • 剧情向的冒险类游戏推荐
    意外事件(UnforeseenIncidents)是一款剧情向的冒险类游戏,游戏的环境是一个手绘式的世界,玩家们将在游戏中扮演一个小镇的勤杂工,一次偶遇让他陷入了一个恶魔般的阴谋中,他必......