题意:给n点m边的连通图,k个人从任意点出发至多经过 个点,求分配方式使得每个点都至少被走过一次
题解:在图中以任意点为根任意dfs出一个生成树,每条边走2次(也就是每次向前走完再回头走),按dfs的顺序得出一个答案序列,总共走过2*(n-1)+1 = 2*n-1个点并且走完所有点,再把连续的 个点分配给一个人,多的人输出1 1即可
#include <iostream>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <set>
#include <stack>
#include <sstream>
#include <queue>
#include <map>
#include <functional>
#include <bitset>
using namespace std;
#define pb push_back
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define mk make_pair
#define fi first
#define se second
#define ALL(A) A.begin(), A.end()
#define rep(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define repr(i, n) for(int (i)=(int)(n);(i)>=0;(i)--)
#define repab(i,a,b) for(int (i)=(int)(a);(i)<=(int)(b);(i)++)
#define reprab(i,a,b) for(int (i)=(int)(a);(i)>=(int)(b);(i)--)
#define sc(x) scanf("%d", &x)
#define pr(x) printf("x:%d\n", x)
#define fastio ios::sync_with_stdio(0), cin.tie(0)
#define frein freopen("in.txt", "r", stdin)
#define freout freopen("out.txt", "w", stdout)
#define freout1 freopen("out1.txt", "w", stdout)
#define lb puts("")
#define PI M_PI
#define debug cout<<"???"<<endl
#define mid ((l+r)>>1)
const ll mod = 1000000007;
//const int INF = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
template<class T> T gcd(T a, T b){if(!b)return a;return gcd(b,a%b);}
const int maxn = 2e5+10;
vector<int> ans, edg[maxn];
int n,m,k,vis[maxn];
void dfs(int u)
{
vis[u] = 1;
ans.pb(u);
for(int i = 0; i < edg[u].size(); i++){
int v = edg[u][i];
if(vis[v]) continue;
dfs(v);
ans.pb(u);
}
}
int main()
{
//frein;
cin >> n >> m >> k;
for(int i = 0; i < m; i++){
int u,v; sc(u); sc(v);
edg[u].pb(v); edg[v].pb(u);
}
dfs(1);
int stp = (2*n+k-1)/k;
for(int i = 0; i < k; i++){
int beg = i*stp, ed = min((i+1)*stp, (int)ans.size());
if(ed <= beg){
printf("1 1\n");
continue;
}
printf("%d", ed-beg);
for(int j = beg; j < ed; j++){
printf(" %d", ans[j]);
}
lb;
}
return 0;
}