首页 > 其他分享 >CF1364D Ehab's Last Corollary 题解 (构造/独立集/找最小环)

CF1364D Ehab's Last Corollary 题解 (构造/独立集/找最小环)

时间:2024-07-20 14:51:15浏览次数:21  
标签:Last dep 题解 极小 int Corollary MAXN lws 一个

题意

给出一张 n 个点的无向连通图和一个常数 k。

你需要解决以下两个问题的任何一个:

  1. 找出一个大小为 \(\lceil \frac k2\rceil\) 的独立集。
  2. 找出一个大小不超过 k 的环。

独立集是一个点的集合,满足其中任意两点之间在原图上没有边直接相连。

可以证明这两个问题必然有一个可以被解决。

题解

考虑如果没有环,可以对这棵树进行一个黑白染色,必定有一个颜色数量是大于等于 \(\frac n2\) 的。

考虑如果有一个环,我们找到一个极小环(即这个环内部没有其它环),然后对这个环的环长进行一个分类讨论:

  1. 环长 \(l\le k\),我们已经找到了一个问题 2 的解。
  2. 环长 \(l>k\),对这个环进行一个黑白染色,发现必定有一个颜色数量大于等于 \(\frac k2\),且由于这是一个极小环,可以保证黑白染色后是独立的,所以我们找到了一个问题 1 的解。

如何找极小环:在 DFS 的过程中对于第一个有返祖边的点 \(u\),对于他的每个返祖边 \((u,v)\),我们取 \(v\) 深度最大的那条边。这样 \((u,v)\) 覆盖的环一定是一个极小环。

证明:考虑反证法,设 \((u,v)\) 内部有一个极小环 \((x,y)\),分类讨论。如果 \(u\ne y\),我们一定会在 \(y\) 的时候就找到一个极小环。如果 \(u=y\) 且 \(x\ne v\),由我们的过程得 \(dep_v>dep_x\),所以 \(x\) 一定是 \(v\) 的祖先,与 \((x,y)\) 是极小环矛盾。故 \((u,v)\) 是极小环。

const int MAXN = 1e5 + 5;
int n, m, k, dep[MAXN], st[MAXN], tp;
vector<int> G[MAXN];

void dfs(int x, int fat) {
	dep[x] = dep[fat] + 1;
	st[++tp] = x;
	int lws = 0; 
	for (auto u:G[x]) {
		if (u == fat) continue;
		if (dep[u] && dep[u] < dep[x]) {
			if (!lws || dep[u] > dep[lws]) lws = u;
		}
	}
	if (lws) {
		int u = lws;
		int len = dep[x] - dep[u] + 1;
		if (len <= k) {
			cout << 2 << endl << len << endl;
			while (st[tp] != u) {
				cout << st[tp] << ' ';
				tp--;
			}
			cout << u << endl;
		} else {
			int c = 0, cnt = 0;
			cout << 1 << endl;
			while (cnt < ceil(k * 1.0 / 2)) {
				if (!c) {
					c = 1;
				} else {
					cnt++;
					cout << st[tp] << ' ';
					c = 0;
				}
				tp--;
			}
		}
		exit(0);
	}
	for (auto u:G[x]) {
		if (u == fat) continue;
		if (!dep[u]) dfs(u, x);
	}
	tp--;
}

int col[MAXN], tcnt[2];

void dfs2(int x, int fat) {
	col[x] = 1 ^ col[fat];
	tcnt[col[x]]++;
	for (auto u:G[x]) {
		if (u == fat) continue;
		dfs2(u, x);
	}
}

void work() {
	cin >> n >> m >> k;
	for (int i = 1, u, v; i <= m; ++i) {
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1, 0);
	dfs2(1, 0);
	cout << 1 << endl;
	int cnt = 0;
	int tt = tcnt[1] > tcnt[0];
	for (int i = 1; i <= n; ++i) {
		if (col[i] == tt) {
			cout << i << ' ';
			++cnt;
		}
		if (cnt == ceil(k * 1.0 / 2)) return;
	}
}

标签:Last,dep,题解,极小,int,Corollary,MAXN,lws,一个
From: https://www.cnblogs.com/XiaoQuQu/p/18313114

相关文章

  • P3588 PUS 题解
    PUS推销我的洛谷博客。题意给出三个整数\(n,s,m\),请你构造一个整数数组\(a\)满足\(1\leqslanta_i\leqslant10^9(1\leqslanti\leqslantn)\)以及\(m\)个约束条件,或判断无解。\(a\)数组中\(s\)个数已经给出(保证合法)。\(m\)个约束条件格式如下:\(l,r,k,x_1,x_2\cd......
  • Spring Book Club + java查询数据库 + 百万数据 + 同步Elasticsearch(ES)+ 多线程 + Fei
    @FeignClient(name="bwie-elastic")publicinterfaceEsFeign{@PostMapping("/add")publicResultadd(@RequestBodyArrayList<ResourceInfo>resourceInfo);}@RestControllerpublicclassUserControllerimplementsApplica......
  • P9531 题解
    blog。提供一份代码短的题解。一个暴力做法:维护\(w_i<w_{now}\)与\(w_i\gew_{now}\)的前后缀MST,查\(X_i\)时将前后缀MST合并,直接求得答案。考虑一棵\((u_{now},v_{now},X)\)的前缀MST。因为\(w_i<X\)时\(w_i\)越大\(\midX-w_i\mid\)越小,所以按边权从大到小......
  • 深入探讨:在 Elasticsearch 6.8.18 中使用 Java 创建带有时间戳的索引
    深入探讨:在Elasticsearch6.8.18中使用Java创建带有时间戳的索引在这篇博客中,我们将深入探讨如何在Elasticsearch6.8.18中使用Java创建带有时间戳的索引。我们将使用Maven进行项目管理,并通过代码示例来详细说明每一步操作。希望这篇文章能帮助你更好地理解和使用Elas......
  • [ARC173E] Rearrange and Adjacent XOR 题解
    题目链接点击打开链接题目解法太牛了!!!这道题我的第一反应是从高位往低位确定,但这样就全错了换个角度考虑,找最后的答案可以由那些数异或而成这里给出结论:答案一定是偶数个数的异或和(在\(n\%4=2\)且\(n\neq2\)时,不能由全集构成)证明:选出的数非全集的情况用数学归纳法......
  • 题解 Codeforces 1994H Fortnite
    首先第一次询问肯定是问\(\texttt{aa}\),答案减去\(1\)得到基数\(p\)。然后我们随意询问一个真实Hash值(取模之前)\(X\)大于模数\(m\)的字符串,例如\(s=\texttt{zzz}\cdots\texttt{zzz}\)(\(50\)个\(\textttz\))。设它取模得到的Hash值是\(a\)。考虑正整数\(1\leqb......
  • CF466E Information Graph 题解
    题目链接LuoguCodeforces题意简述某公司中有\(n\)名员工。为方便起见,将这些员工从1至\(n\)编号。起初,员工之间相互独立。接下来,会有以下\(m\)次操作:员工\(y\)成为员工\(x\)的上司。保证此前\(x\)没有上司。员工\(x\)拿到一份文件并签字,随后交给他的上司......
  • P3206 城市建设 题解
    Statement动态边权的最小生成树。\(n\le2\cdot10^4,m,q\le5\cdot10^4\)Solution法一:改边权相当于删一条边再加一条边.考虑LCT维护最小生成树,加边好做,但删边比较麻烦,于是采用线段树分治,撤销一条边是好做的,cut再link一下就行了.\(O(n\logn\logq)\),常数较大.法二:两个结......
  • 07-19 题解
    07-19题解B思路实质:有一个完全图,删掉一些边,然后在图上找一棵生成树但是图的边数是\(n^2\)级别的,极其稠密找生成树的步骤:从一个点开始,把与它相连的,不在同一连通块的点连在一起所以我们只要确保每次都能在尽量少的步数内找到一个合法点一共有n个点,确定一个点之......
  • 2024年牛客暑期多校训练营1 A题 A Bit Common题解
    题目的大意:首先,给你一个长度为n的序列A,A序列中每一个元素全都小于2m,并且大于等于0。A序列要满足存在一个非空子序列的与运算(&)和为1;输出这样的A序列有几个,最后对正整数q取模。(1<=n,m<=5000,1<=q<=109)输入只有一行n,m,q,输出包含一个整数。 题解:要满......