首页 > 其他分享 >[Codeforces] CF1675D Vertical Paths

[Codeforces] CF1675D Vertical Paths

时间:2023-12-02 18:44:06浏览次数:33  
标签:cnt Vertical int 路径 Codeforces CF1675D Maxn 顶点 节点

题目描述

给定一棵由 \(n\) 个顶点组成的有根树。顶点由 \(1\) 到 \(n\) 编号。任何顶点都可以是树的根。

请在树上找出这样一组路径:

  • 每个顶点恰好属于一条路径,每条路径可以包含一个或多个顶点;
  • 在每条路径中,每个节点的下一个节点是当前节点的子节点(即路径总是向下 —— 从父节点到子节点);
  • 路径的数量最少。

思路

很明显,任何一棵树,如果我们按照其深度优先遍历的顺序分段(每次向后退时分一段),那么得到的一定是最小的路径数量。

为什么呢?想象一下,假如我们到达了一个节点,他有三个子节点,无论选哪个,路径都最少会分出三个叉来

所以,这道题就成了一道深搜

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+10;
int n,cnt,root;
int p[Maxn];
vector<int>node[Maxn];
vector<int>ans[Maxn];
void find(int now)
{
	ans[cnt].push_back(now);
	if(node[now].size()==0)
	{
		cnt++;
		return ;
	}
	for(int i=0;i<node[now].size();i++) find(node[now][i]);
}
void run()
{
	cin>>n;cnt=0;
	vector<int>t;
	for(int i=0;i<=n+1;i++) ans[i]=t,node[i]=t;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		if(p[i]==i) root=i;
		else 
		{
			node[p[i]].push_back(i);
		}
	}
	find(root);
	cout<<cnt<<endl;
	for(int i=0;i<cnt;i++)
	{
		cout<<ans[i].size()<<endl;
		for(int j=0;j<ans[i].size();j++)
		{
			cout<<ans[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--) run();
}

标签:cnt,Vertical,int,路径,Codeforces,CF1675D,Maxn,顶点,节点
From: https://www.cnblogs.com/lyk2010/p/17872020.html

相关文章

  • Codeforces Round 912 (Div. 2) E - Geo Game
    考虑什么时候会改变答案的奇偶,显然可以根据\(x\oplusy\)的奇偶性分组,在组内进行跳跃不会改变,只有当组间跳跃的时候才会改变。打表观察先手什么时候必胜,其中:\(u\)是当前获胜目标为奇/偶(1/0),\(v\)是位于哪一组,\(a,b\)代表两组还剩多少,\(st\)代表当前答案的奇偶性。intdfs(intu,......
  • 【ErikTse】2023-Codeforces新手训练营 第六期题解
    A.Wrath题目大意给你一个\(L\)数组和\(n\)个人,第\(i\)个人可以使用威力为\(L_i\)的闪电旋风劈击杀前面\(L_i\)人,问你最后能存活多少人?思路差分。开一个数组来标记当前威力的闪电旋风劈能击杀到的最远的人和使用技能的人,最远击杀的人所在的位置+1,自己的位置-1,这样算前缀和时所......
  • Codeforces Round 912 (Div. 2)
    CodeforcesRound912(Div.2)基本概述最难受的一集。A题秒了。B题幸苦推了两个小时,最后也通过了pretest了,结果赛后被HACK。C题知道是DP,但觉得不好推状态转移方程,所以全心全意去做B题了。爆掉\(150\)分B.StORageroom我的思路其实就几乎是答案。之前几乎没怎......
  • [Codeforces] CF1591C Minimize Distance
    CF1591CMinimizeDistance题目一条线上有\(n\)(\(1\len\le2\cdot10^5\))个仓库,第\(i\)个仓库的位置是\(x_i\)(\(1\lei\len\))。你有\(n\)箱货物,要分别运到这\(n\)个仓库里。你的初始位置在点\(0\),一次可以携带\(k\)(\(1\lek\len\))箱货物。在送完携带......
  • [Codeforces] CF1603A Di-visible Confusion
    CF1603ADi-visibleConfusion题目给一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),对于每个位置\(i\),如果\(a_i\%\left(i+1\right)\not=0\),就可以将\(a_i\)删掉。删掉之后,后面的数都会往前面移动一位。问能否将序列删成空。数据范围\(1\let\le10^4,1\len\le10^5,1\le......
  • Codeforces Round 883 (Div. 3)
    CodeforcesRound883(Div.3)A.RudolphandCuttheRope题意:有一颗糖果在连在绳子上,求剪短多少根绳子,他能落地思路:只要绳子长度比钉子高度大就不用减#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,res=0;cin>>n;while(n--)......
  • Codeforces Round 911 (Div. 2)
    CodeforcesRound911(Div.2)基本情况A题秒了。B题条件没想明白,也不造点数据就无脑交,导致罚了不少时。B.LauraandOperations我先推出了,对于一个数,当另外两个数的个数之和为偶数时解可行,且这个数本身要能跟后面数替换。比如11223333就可以操作122333(1......
  • Codeforces Round 910 (Div. 2)
    https://codeforces.com/contest/1898C题可以造一个大小为4的环,然后再造一个来回,这样就解决了%4=0,%4=2的情况,而奇数的情况显然无解。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#includ......
  • Codeforces Round 829 (Div. 1)A1. Make Nonzero Sum (easy version)(思维找规律)
    先考虑无解的情况:当n为奇数时无解相邻的两个元素一定可以变成0\[a[i]!=a[i+1]时,分成[i,i],和[i+1,i+1]\]\[a[i]=a[i+1]时,分成[i,i+1]\]这两种情况对答案的贡献都是0,当n为奇数时我们总会有一个没办法凑成0.#include<bits/stdc++.h>#definelsp<<1#......
  • Educational Codeforces Round 158 (Rated for Div. 2)
    A.LineTripThereisaroad,whichcanberepresentedasanumberline.Youarelocatedinthepoint\(0\)ofthenumberline,andyouwanttotravelfromthepoint\(0\)tothepoint\(x\),andbacktothepoint\(0\).Youtravelbycar,whichs......