1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <stdio.h> #include <stdlib.h> #include <limits.h> #define max(a, b) (((a) > (b)) ? (a) : (b))
int n, m; int arr[16][16] = {0}; int min_dist = INT_MAX; int min_pos[16];
void dfs(int now[], int now_idx, int used[], int now_max_dist){ if(now_max_dist >= min_dist) return; if(now_idx == n){ min_dist = now_max_dist; for(int i = 0; i < n; i++) min_pos[i] = now[i]; } else{ for(int i = 0; i < n; i++){ if(used[i] == 0){ used[i] = 1, now[now_idx] = i;
int temp_max_dist = 0; for(int j = 0; j < now_idx; j++){ if(arr[i][now[j]]){ temp_max_dist = now_idx - j; break; } } temp_max_dist = max(temp_max_dist, now_max_dist); dfs(now, now_idx + 1, used, temp_max_dist); used[i] = 0, now[now_idx] = 0; } } } }
int main(){ scanf("%d %d", &n, &m); getchar(); for(int i = 0; i < m; i++){ char a, b; a = getchar(); getchar(); b = getchar(); getchar(); arr[a - 'A'][b - 'A'] = 1; arr[b - 'A'][a - 'A'] = 1; }
int now[16] = {0}; int used[16] = {0}; dfs(now, 0, used, 0);
printf("%d\n", min_dist); printf("%c", min_pos[0] + 'A'); for(int i = 1; i < n; i++) printf(" %c", min_pos[i] + 'A'); printf("\n"); return 0;
}
|