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

题目大意
我们首先来分析一下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;
}
赛后总结
比赛时完全没有看出两个条件与环的关系,寄了。

浙公网安备 33010602011771号