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

[JSOI2014]支线剧情2

时间:2022-12-14 21:01:44浏览次数:53  
标签: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 #include #include 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<

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

相关文章

  • [AHOI2014/JSOI2014]骑士游戏
    链接:https://www.luogu.com.cn/problem/P4042题目描述:对于一个怪物$i$,可以花费$c_{i}$的代价将其变为一个怪物集合,或花费$c2_{i}$的代价消灭他。求消灭怪物$1$的最小代......
  • 视效剧情口碑双爆棚!Netflix 现象级剧集《怪奇物语》第四季神级视效专访大揭秘!
    刷新Netflix收视记录的超火剧集《怪奇物语》(StrangerThings)第四季视效剧情口碑双爆棚,无疑是2022年最值得一看的现象级剧集之一。第四季共九集,分上下两部,分别在今年5月......
  • 剧情向的冒险类游戏推荐
    意外事件(UnforeseenIncidents)是一款剧情向的冒险类游戏,游戏的环境是一个手绘式的世界,玩家们将在游戏中扮演一个小镇的勤杂工,一次偶遇让他陷入了一个恶魔般的阴谋中,他必......