题目链接:http://codeforces.com/problemset/problem/781/C
因为有${K}$个机器人,每个又可以走${\left \lceil \frac{2n}{k} \right \rceil}$步,所以这些机器人一共可以走的总步数就至少为${2n}$,然后再发现直接$DFS$整张图,记录经过的路径这样是不超过$2n$个点的,所以划分一下这个序列就可以了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1001000
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,k,dl[maxn],tail,ans[maxn];
vector<llg>a[maxn];
bool bj[maxn];
void init()
{
llg x,y;
cin>>n>>m>>k;
for (llg i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[x].push_back(y),a[y].push_back(x);
}
} void dfs(llg x)
{
bj[x]=;
llg w=a[x].size(),v;
dl[++tail]=x;
for (llg i=;i<w;i++)
{
v=a[x][i];
if (!bj[v])
{
dfs(v);
dl[++tail]=x;
}
}
} int main()
{
yyj("E");
init();
dfs();
llg l=;
llg up=(*n)/k,cs;
if ((n*)%k) up++;
while ()
{
if (l>tail) break;
k--;
cs=;
while (l<=tail)
{
cs++;
if (cs>up) {cs--; break;}
ans[cs]=dl[l]; l++;
}
printf("%d ",cs);
for (llg i=;i<=cs;i++) printf("%d ",ans[i]);
printf("\n");
}
while (k--)
{
puts("1 1");
}
return ;
}