【题解】CF1583E Moment of Bloom
题面传送门
解决思路
没有思路时可以先手玩样例。
以样例
所以,得出结论:若所有起点终点都出现了偶数次,即满足了题目要求。
然后考虑如何求出路径。因为要求出现次数为
那不满足要求怎么办?以样例
AC Code
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0)
#define int long long
using namespace std;
int n,m,u,v,q,d[300005],s[300005],t[300005],ans;
vector<int> a[300005],b;
bool fl;
struct DSU{
int fa[300005];
void init(int n){
for(int i=1;i<=n;i++) fa[i]=i;
}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
fa[find(x)]=find(y);
}
bool query(int x,int y){
return find(x)==find(y);
}
}dsu;
void dfs(int x,int fa,int to){
for(int i=0;i<a[x].size();i++){
int tmp=a[x][i];
if(tmp==fa) continue;
b.push_back(tmp);
if(tmp==to){ //走到了
fl=1;
return ;
}
dfs(tmp,x,to);
if(fl) return ;
b.pop_back();
}
}
signed main(){
IOS;TIE;
cin>>n>>m;
dsu.init(n);
for(int i=1;i<=m;i++){
cin>>u>>v;
if(!dsu.query(u,v)){
dsu.merge(u,v);
a[u].push_back(v);
a[v].push_back(u); //建成一颗树
}
}
cin>>q;
for(int i=1;i<=q;i++){
cin>>s[i]>>t[i];
d[s[i]]++,d[t[i]]++; //作为起点或终点出现次数
}
for(int i=1;i<=n;i++) if(d[i]&1) ans++;
if(ans==0){
cout<<"YES"<<endl;
for(int i=1;i<=q;i++){
b.clear(),fl=0,b.push_back(s[i]); //b记录路径
dfs(s[i],0,t[i]);
cout<<b.size()<<endl;
for(int j=0;j<b.size();j++) cout<<b[j]<<' ';
cout<<endl;
}
}
else cout<<"NO"<<endl<<ans/2<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话