http://codeforces.com/contest/782/problem/E
题目大意:
有n个节点,m条边,k个人,k个人中每个人都可以从任意起点开始走(2*n)/k步,且这个步数是向上取整的。要求:着k个人要走完所有的节点,且每个人至少走1步。
思路:= =dfs找一棵树,一棵树是n-1条边,所以从树根开始走完所有的,也就只有n*2-2步,所以不会达到上限。md这么简单都没有想到,233
//看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; #pragma comment(linker,"/STACK:102400000,102400000") #define LL long long #define ALL(a) a.begin(), a.end() #define pb push_back #define mk make_pair #define fi first #define se second #define haha printf("haha\n") const int maxn = 2e5 + 10; int n, m, k; vector<int> G[maxn]; bool vis[maxn]; vector<int> ans[maxn]; int lim, cnt, rest; void dfs(int u){ vis[u] = true; ans[cnt].pb(u); rest--; if (rest == 0) {cnt++; rest = lim;} for (int i = 0; i < G[u].size(); i++){ int v = G[u][i]; if (vis[v]) continue; dfs(v); ans[cnt].pb(u); rest--; if (rest == 0) {cnt++; rest = lim;} } } int main(){ cin >> n >> m >> k; for (int i = 1; i <= m; i++){ int u, v; scanf("%d%d", &u, &v); G[u].pb(v); G[v].pb(u); } lim = n * 2 / k; if ((2 * n) % k) lim++; rest = lim, cnt = 1; dfs(1); if (rest == lim) cnt--; for (int i = cnt + 1; i <= k; i++){ ans[i].pb(1); ans[i].pb(G[1][0]); } for (int i = 1; i <= k; i++){ printf("%d ", ans[i].size()); for (int j = 0; j < ans[i].size(); j++){ printf("%d ", ans[i][j]); } cout << endl; } return 0; }