cf780E(dfs)

题目链接: http://codeforces.com/problemset/problem/780/E

 

题意: 给出一个 n 个点 m 条边的图, 有 k 个人, 初始位置可以为任意位置, 每个人最多不能经过超过 ceil(2 * n / k) 个顶点. 要使 k 个人经历所有顶点, 并输出 k 个人经历的顶点数目和路径.

 

思路: 先 dfs 遍历一下图, 并记录路径 (回溯路径也要记录). 然后再将路径按条件分配给 k 个人即可.

 

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <vector>
 4 using namespace std;
 5 
 6 const int MAXN = 2e5 + 10;
 7 vector<int> vt[MAXN];
 8 int vis[MAXN], path[MAXN << 2];
 9 int indx = 0;
10 
11 void dfs(int x){
12     vis[x] = 1;
13     path[++indx] = x;
14     for(int i = 0; i < vt[x].size(); i++){
15         if(!vis[vt[x][i]]){
16             dfs(vt[x][i]);
17             path[++indx] = x;
18         }
19     }
20 }
21 
22 int main(void){
23     int n, m, k, x, y;
24     scanf("%d%d%d", &n, &m, &k);
25     for(int i = 0; i < m; i++){
26         scanf("%d%d", &x, &y);
27         vt[x].push_back(y);
28         vt[y].push_back(x);
29 
30     }
31     dfs(1);
32     int cnt = (2 * n + k - 1) / k;
33     for(int i = 0; i < k; i++){
34         int cc = min(cnt, indx);
35         if(!cc){
36             printf("1 1\n");
37             continue;
38         }
39         printf("%d ", cc);
40         for(int j = 0; j < cc && indx; j++,indx--){
41             printf("%d ", path[indx]);
42         }
43         puts("");
44     }
45     return 0;
46 }
View Code

 

posted @ 2017-07-13 18:27  geloutingyu  阅读(264)  评论(0编辑  收藏  举报