打卡信奥刷题(3580)用C++实现信奥题 P11486 「Cfz Round 5」Mata rainen

P11486 「Cfz Round 5」Mata rainen

题目背景

题目名称意为:明年见。

小 R 是一个正在上高三的女孩子。她在升入高三的暑假复习了《种树郭橐(tuó)驼传》,便编出了这道与树有关的题。

在把这道题目丢给出题组后,她决定把全部时间和精力投入到高考的旅程中,期待在 2025 年的暑假在算法竞赛中与大家再会。

题目描述

请判断是否存在一棵树满足如下条件。若存在,请尝试给出构造。

树中包含 n n n 个结点,编号为 1 ∼ n 1\sim n 1n。另外,给定 m m m 个点对 ( s i , t i ) (s_i,t_i) (si,ti),要求树上这 m m m 条从点 s i s_i si 到点 t i t_i ti 的路径覆盖每条边恰好一次 † ^\dagger

若你正确判断了是否有解,但不会构造出这棵树,也可以获得一定的分数,详见【评分方式】。

† \dagger 称从点 s s s 到点 t t t 的路径覆盖一条边 ( u , v ) (u,v) (u,v),当且仅当边 ( u , v ) (u,v) (u,v) 在点 s s s 到点 t t t 的最短路径上。

输入格式

第一行包含两个整数 n , m n,m n,m,表示这棵树的点数和给出的点对数。

接下来 m m m 行,每行两个整数 s i , t i s_i,t_i si,ti,表示一个点对。

输出格式

第一行输出一个字符串 YesNo(大小写不敏感),表示是否有解。

若有解,继续输出 n − 1 n-1 n1 行,每行包含两个整数 u i , v i u_i,v_i ui,vi,描述一条边。你需要保证 1 ≤ u i , v i ≤ n \bm{1\le u_i,v_i\le n} 1ui,vin 且所有边构成一棵树。

输入输出样例 #1

输入 #1

6 2
1 2
3 4

输出 #1

Yes
1 5
2 5
3 5
4 6
5 6

输入输出样例 #2

输入 #2

3 3
1 2
2 3
1 3

输出 #2

No

说明/提示

「样例解释 #1」

左上图为样例输出中给出的树。边 ( 1 , 5 ) , ( 5 , 2 ) (1,5),(5,2) (1,5),(5,2) 被路径 ( 1 , 2 ) (1,2) (1,2) 覆盖,边 ( 3 , 5 ) , ( 5 , 6 ) , ( 6 , 4 ) (3,5),(5,6),(6,4) (3,5),(5,6),(6,4) 被路径 ( 3 , 4 ) (3,4) (3,4) 覆盖,符合题目要求。

右上图中边 ( 5 , 6 ) (5,6) (5,6) 被路径 ( 1 , 2 ) (1,2) (1,2) ( 3 , 4 ) (3,4) (3,4) 覆盖,不符合题目要求。

左下图中边 ( 5 , 6 ) (5,6) (5,6) 未被任何路径覆盖,不符合题目要求。

右下图不是一棵树,不符合题目要求。

「样例解释 #2」

可以证明不存在符合要求的树。

「评分方式」

本题采用自定义校验器(Special Judge)进行评测。

对于每个测试点:

  • 若第一行格式错误或与答案不匹配(大小写不敏感),得 0 % 0\% 0% 的分数。
  • 若第一行答案正确且为 No,得 100 % 100\% 100% 的分数。
  • 若第一行答案正确且为 Yes但后 n − 1 n-1 n1 行格式错误,得 0 % 0\% 0% 的分数。
    因此,请务必保证输出为一棵树
  • 若第一行答案正确且为 Yes,后 n − 1 n-1 n1 行格式正确但树不符合要求,得 20 % 20\% 20% 的分数。
  • 若第一行答案正确且为 Yes,后 n − 1 n-1 n1 行格式正确且树符合要求,得 100 % 100\% 100% 的分数。

也就是说,对于第一个样例,在正确输出 Yes 的基础上,输出左上图可以得到满分,输出右上图、左下图可以得到 20 % 20\% 20% 的分数,输出右下图不能得到任何分数;对于第二个样例,正确输出 No 即可得到满分。

「数据范围」

对于所有测试数据,保证:

  • 2 ≤ n ≤ 3 × 10 5 2\le n\le 3\times 10^5 2n3×105
  • 1 ≤ m ≤ 3 × 10 5 1\le m\le 3\times 10^5 1m3×105
  • 1 ≤ s i , t i ≤ n 1\le s_i,t_i\le n 1si,tin s i ≠ t i s_i\ne t_i si=ti

本题采用捆绑测试。

  • Subtask 0(10 points): n ≤ 3 n\le 3 n3 m ≤ 3 m\le 3 m3
  • Subtask 1(10 points): n ≤ 10 n\le 10 n10 m ≤ 10 m\le 10 m10
  • Subtask 2(20 points): m = 1 m=1 m=1
  • Subtask 3(10 points): n ≤ 300 n\le 300 n300 m ≤ 300 m\le 300 m300
  • Subtask 4(10 points): n ≤ 2 × 10 3 n\le 2\times 10^3 n2×103 m ≤ 2 × 10 3 m\le 2\times 10^3 m2×103
  • Subtask 5(20 points): m ≤ 2 × 10 3 m\le 2\times 10^3 m2×103
  • Subtask 6(20 points):无特殊限制。
「Hack 数据」

本题于赛后添加了部分 Hack 数据。这些数据均满足 Subtask 6 对数据规模的限制,他们被添加到 Subtask 7 中。这些数据不计分,但只有通过所有数据,才算做 AC 本题。

  • Subtask 7(0 points):赛后添加的 Hack 数据。

C++实现

#include<bits/stdc++.h>
using namespace std;
#define N 300005
int n,m,f[N];
int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
int last,cnt=0;
struct node{
	int x,y;
}e[N];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++){
		cin>>e[i].x>>e[i].y;
		if(find(e[i].x)!=find(e[i].y))
			f[find(e[i].y)]=find(e[i].x);
		else{
			cout<<"No"<<'\n';
			return 0;
		}
	}
	cout<<"Yes"<<'\n';
	for(int i=1;i<m;i++)
		cout<<e[i].x<<" "<<e[i].y<<'\n';
	last=e[m].x;
	for(int i=1;i<=n;i++){
		if(find(i)==i&&find(i)!=find(e[m].x)){
			cout<<last<<" "<<i<<'\n';
			last=i;
		}
	}
	cout<<e[m].y<<" "<<last<<'\n';
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值