首页 > 其他分享 >【AtCoder】Beginner Contest 378-F.Add One Edge 2

【AtCoder】Beginner Contest 378-F.Add One Edge 2

时间:2024-11-17 16:14:43浏览次数:3  
标签:度数 AtCoder cnt Beginner Contest int Sample leq deg

[题目链接](F - Add One Edge 2 (atcoder.jp))

Problem Statement

You are given a tree with N N N vertices. The i i i-th edge ( 1 ≤ i ≤ N − 1 ) (1 \leq i \leq N-1) (1≤i≤N−1) connects vertices u i u_i ui​ and v i v_i vi​ bidirectionally.

Adding one undirected edge to the given tree always yields a graph with exactly one cycle.

Among such graphs, how many satisfy all of the following conditions?

  • The graph is simple.
  • All vertices in the cycle have degree 3 3 3.

中文题意

问题陈述

给你一棵有 N N N 个顶点的树。 i − t h i -th i−th 边 ( 1 ≤ i ≤ N − 1 ) (1 \leq i \leq N-1) (1≤i≤N−1) 双向连接顶点 u i u_i ui​ 和 v i v_i vi​ 。

在给定的树上添加一条无向边会得到一个有一个循环的图。

在这些图中,有多少个满足以下所有条件?

  • 图很简单。
  • 循环中的所有顶点都有度数 3 3 3 。

Constraints

  • 3 ≤ N ≤ 2 × 1 0 5 3 \leq N \leq 2 \times 10^5 3≤N≤2×105
  • 1 ≤ u i , v i ≤ N 1 \leq u_i, v_i \leq N 1≤ui​,vi​≤N
  • The given graph is a tree.
  • All input values are integers.

Input

The input is given from Standard Input in the following format:
N N N
u 1 u_1 u1​ v 1 v_1 v1​
u 2 u_2 u2​ v 2 v_2 v2​
⋮ \vdots ⋮
u N − 1 u_{N-1} uN−1​ v N − 1 v_{N-1} vN−1​

Output

Print the answer.

Sample Input 1

6
1 2
2 3
3 4
4 5
3 6

Sample Output 1

1

Adding an edge connecting vertices 2 2 2 and 4 4 4 yields a simple graph where all vertices in the cycle have degree 3 3 3, so it satisfies the conditions.

Sample Input 2

7
1 2
2 7
3 5
7 3
6 2
4 7

Sample Output 2

0

There are cases where no graphs satisfy the conditions.

Sample Input 3

15
1 15
11 14
2 10
1 7
9 8
6 9
4 12
14 5
4 9
8 11
7 4
1 13
3 6
11 10

Sample Output 3

6

解法

考虑,新增加一条边必然会使得所连接的两个点的度数 + 1 + 1 +1。现在要求环上的所有节点的度数都为 3 3 3 ,在这里我们可以对目前树中部分度数为3的点视为一个连通块。然后我们对于每一个顶点,依次统计一下与其相连的节点度数是否为 2 2 2。如果是 2 2 2,将 cnt 的数量 + 1 +1 +1 ,因为每次连接成环的话,是选择其中两个顶点,那么最后的答案数为 C n 2 C_{n}^{2} Cn2​ 。

typedef long long LL;
std::vector<int> G[N];
int deg[N];
bool visit[N];
LL cnt, ans;

void dfs(int v, int fa = 0) {
	if(deg[v] != 3) {
		// v是一个周边的点
		cnt += (deg[v] == 2);
		return ;
	}

	visit[v] = 1;
	for (auto x : G[v]) {
		if(x == fa) continue;
		dfs(x, v);
	}
}

void solved() {
	/* your code */
	int n;
	cin >> n;
	for (int i = 1; i < n; i ++) {
		int u, v;
		cin >> u >> v;
		G[u].push_back(v); G[v].push_back(u);
		deg[u] ++, deg[v] ++;
	}

	for (int i = 1; i <= n; i ++) {
		//找度数为3的连通块
		if(deg[i] != 3) continue;	
		if(visit[i]) continue;
		cnt = 0;
		dfs(i);
		ans += 1LL * cnt * (cnt - 1) / 2; 
	}
	cout << ans << endl;
}

总结

本道题目,看似是一个树的题目。我们将其转化为了一个dfs 型的联通块计算题目。然后使用组合计数即可。

标签:度数,AtCoder,cnt,Beginner,Contest,int,Sample,leq,deg
From: https://blog.csdn.net/weixin_55818116/article/details/143799011

相关文章

  • AtCoder Beginner Contest 380 A - E
    link赛时是ABC,D一眼要找规律,跳了,E题思路想了接近半个小时,然后发现假了,最后没调出来,问一下dalao发现其实很简单维护。。。基础线段树没切掉,哎呦不过发现比赛打多了,理解速度和手速都有些提高,幸好前三题秒掉了,要不然rating又会是一坨A-123233B-HurdleParsingC-M......
  • AtCoder Beginner Contest 380
    省流版A.计数判断即可B.计数统计即可C.模拟即可D.注意到字符串是左右大小写镜像,从长度大往小依次考虑实际所处的位置,维护镜像次数集合E.并查集维护连通性,并尝试与左右俩格子合并即可F.博弈\(dp\),状态数只有\(5e5\),直接记忆化搜索即可G.枚举打乱起始位置,全排列分......
  • Atcoder 11.17
    这是11.17号的题单4.第四题是字符串的问题,只需要找到规律即可,对于每个查询k[i],首先计算a和aa:a是(k[i]-1)//ls,即k[i]-1除以字符串长度ls的商。这相当于确定k[i]在重复字符串中属于第几个完整的字符串块。aa是bin(a).count("1")%2,即a的二进制表示中"1"......
  • 2021 Hubei Provincial Collegiate Programming Contest E. Revue
    题目描述n个人,每个人的初始分数不同(具体分数未知)有m次已知的Revue(按顺序发生),每次Revue形式为(x,y),意为x打败y,之后x的分变成二者max,y变成min现在你要按顺序在最后加入w次Revue,要保证在所有m+w次Revue中删掉任意k(k给出)次Revue后的所有初始分数的可能中,1都能获得最大分值最小......
  • 2021 Hubei Provincial Collegiate Programming Contest/2021湖北省赛 题解
    按解决顺序排列目录FAIDHECKJGBF二分答案ans,放最小的前ans个bi(变成必须放完)因为bi=2^k,所以小的放了可能会拆散大的空间,大的把小的地方占了的话小的可以塞其他地方,所以先放大的然后暴力能放则放,最多log次指针回到开头所以一次求解O(nlogn),总复杂度log^2A模拟,暴力枚举暴力异......
  • AtCoder Beginner Contest 380
    A-123233题意给个\(6\)位数,判断是否是\(1\)个\(1\),\(2\)个\(2\),\(3\)个\(3\)。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ s......
  • AtCoder Grand Contests 杂做
    感觉AGC003及以前的题做了大部分,所以从AGC004开始,选一些我觉得合适的题做。AGC004E-*3200一直在往静态的几何(或者代数)限制想,结果没想到可以动态规划。为了更加直观可以看作出口在移动,然后到过的点加分,某些出界的点就被ban掉了。我们可以直接考虑定义\(f_{l,r,u,d}\)......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • The 2024 ICPC Asia Nanjing Regional Contest
    Preface因为最近大家都有考试啥的,实在太久没训练了,只好在成都到郑州的火车上VP了一场顶着喧闹的车厢以及电脑只能放在腿上打的巨大Debuff,成功打出7题巨大罚时不过可惜的是4h后就没出题了,剩下的C,F瞪了半天是一个不会,甚至赛后看C的题解也搞不明白,只能说计数苦手是这......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......