NC213863. 克隆
描述
输入描述
第一行三个正整数 n,m,k,意义与题目描述中一致
接下来 m 行,每行两个正整数 u,v 表示原图中的一条无向边 (u,v)
输出描述
如果存在解,第一行输出 'YES'(不含引号),接下来输出 k 行,每行先输出一个整数 p,表示这个分身经过的点的数量,接下来按分身经过点的顺序输出 p 个数,表示这个分身经过的点
如果有多解只需要输出一组解
如果不存在点,输出 'NO' 即可(不含引号)
示例1
输入:
3 2 1 2 1 3 1
输出:
YES 4 1 2 1 3
示例2
输入:
5 4 2 1 2 2 3 2 4 1 5
输出:
YES 5 1 2 3 2 4 1 5
C++(clang++11) 解法, 执行用时: 224ms, 内存消耗: 10564K, 提交时间: 2020-11-20 19:17:42
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=100005; int n,m,k; vector<int> g[N]; bool vis[N]; int a[N<<1],cnt; void dfs(int u){ vis[u]=1;a[++cnt]=u; for(auto v:g[u]){ if(vis[v]) continue; dfs(v); a[++cnt]=u; } } int main(){ int i,j; cin>>n>>m>>k; for(i=1;i<=m;i++){ int u,v;cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } dfs(1); cout<<"YES"<<endl; int pos=1; for(i=1;i<=k;i++){ int p=(cnt+k-1)/k; if(pos+p-1>cnt) p=cnt-pos+1; cout<<p<<" "; while(p--) cout<<a[pos++]<<" "; cout<<endl; } return 0; }