2025.07.12__2025 睿抗编程技能赛(省赛)题解(u4)

u4题目链接

image

题目大意

我们首先来分析一下Tree Tree的两个条件,可以看出G'是环,只有环能同时满足这两个条件。
所以题目就是想让我们找出给定图中最大的环和次大的环。

思路

直接用dfs跑每一个点,找出所有可能的环。记录最大环和次大环。

注意事项

(1)只要有一条边,就存在有一个环有两个点,所以最大的环最小就有两个点;
如果最大的环有超过两个点,就说明第二大的环最少有两个点。
(2)如果最大的环只有两个点,就说明第二大的环只有1个点。
(3)如果最大的环只有一个点,就说明第二大的环没有点。

代码

点击查看代码
#include <bits/stdc++.h>
#define int long long 
#define PII pair<int,int>
#define pb push_back
#define fi first
#define se second
#define endl '\n'
using namespace std;
const int N=1e6+10,M=1010,mod=1e9+7;
const int INF=0x3f3f3f3f;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,m,k;
int ans1,ans2;
vector<bool> st;
vector<int> g[N];

void dfs(int u,int fa,int begin,int cnt){
	for(auto& v:g[u]){
		if(v==fa||st[v]) continue;
		if(v==begin){
			if(cnt>ans1) ans2=ans1,ans1=cnt;
			else if(ans1>cnt&&cnt>ans2) ans2=cnt;
		}
		st[v]=1;
		dfs(v,u,begin,cnt+1);
		st[v]=0;
	}
}

void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		g[i].clear();
	}
	st.assign(n+10,0);
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		g[a].pb(b),g[b].pb(a);
	}
	ans1=1,ans2=0;
	for(int i=1;i<=n;i++){
		dfs(i,i,i,1);
	}
	if(m>=1) ans1=max(ans1,2LL);
	if(ans1>2) ans2=max(ans2,2LL);
	else if(ans1==2) ans2=1;
	cout<<ans1<<' '<<ans2<<endl;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
    cin>>_;
	while(_--) solve();
	return 0; 
} 

赛后总结

比赛时完全没有看出两个条件与环的关系,寄了。

posted @ 2025-07-15 10:24  _hu  阅读(127)  评论(2)    收藏  举报