【简单图论】CF1833 E

Problem - E - Codeforces

题意:

思路:

显然,最大值就是什么边都不连的连通块个数,最小值就是能连的都连上

那就是,如果一个连通块存在度为1的点,就把它当作接口连接

Code:

cpp 复制代码
#include <bits/stdc++.h>

#define int long long

using namespace std; 

const int mxn=2e5+10;

int N,x;
int F[mxn],FG[mxn],sz[mxn];

set<int> G[mxn];

int find(int x){
	return F[x]=(x==F[x])?x:find(F[x]);
}
void join(int u,int v){
	int f1=find(u),f2=find(v);
	if(f1!=f2){
		F[f1]=f2;
		sz[f2]+=sz[f1];
	}
}
void solve(){
	cin>>N;
	for(int i=1;i<=N;i++){
		F[i]=i;
		sz[i]=1;
		G[i].clear();
		FG[i]=0;
	}
	for(int i=1;i<=N;i++){
		cin>>x;
		G[i].insert(x);
		G[x].insert(i);
		join(x,i);
	}
	for(int i=1;i<=N;i++){
		FG[find(i)]|=(G[i].size()==1);
	}
	int cnt=0,res=0;
	for(int i=1;i<=N;i++){
		if(find(i)==i){
			res++;
			cnt+=FG[i];
		}
	}
	cout<<min(res,res-cnt+1)<<" "<<res<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;cin>>__;
	while(__--)solve();return 0;
} 
相关推荐
wuqingshun31415921 分钟前
蓝桥杯 切割
数据结构·c++·算法·职场和发展·蓝桥杯
艾妮艾妮24 分钟前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
百度Geek说25 分钟前
前沿多模态模型开发与应用实战3:DeepSeek-VL2多模态理解大模型算法解析与功能抢先体验
算法
小王努力学编程26 分钟前
动态规划学习——回文子串系列问题【C++】
c++·学习·算法·leetcode·动态规划
ZTLJQ1 小时前
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
人工智能·算法·机器学习
JohnFF1 小时前
48. 旋转图像
数据结构·算法·leetcode
bbc1212261 小时前
AT_abc306_b [ABC306B] Base 2
算法
生锈的键盘1 小时前
推荐算法实践:movielens数据集
算法
董董灿是个攻城狮1 小时前
Transformer 通关秘籍9:词向量的数值实际上是特征
算法
林泽毅1 小时前
SwanLab x EasyR1:多模态LLM强化学习后训练组合拳,让模型进化更高效
算法·llm·强化学习