알고리즘 7 - 6: 그림 의 옮 겨 다 니 기 - 넓이 우선 검색 (c 언어)

2293 단어
[제출] [통계] [질문]
제목 설명
트 리 와 같은 차원 으로 옮 겨 다 니 는 과정 을 우선 검색 합 니 다.그 과정 은 그림 속 의 특정한 정점 v 에서 출발 하여 v 를 방문 한 후에 v 의 방문 되 지 않 은 각 인접 점 을 차례대로 방문 한 다음 에 각각 이러한 인접 점 에서 출발 하여 그들의 인접 점 을 차례대로 방문 하고 '먼저 방문 되 는 정점 의 인접 점' 을 '나중에 방문 되 는 정점 의 인접 점' 보다 먼저 방문 하 게 한다.그림 에 있 는 모든 방문 한 정점 의 인접 점 이 접근 할 때 까지.만약 이 그림 에 정점 이 방문 되 지 않 았 다 면, 다른 그림 에서 방문 되 지 않 은 정점 을 시작 점 으로 선택 하 십시오.그림 의 모든 정점 이 방문 할 때 까지 상기 과정 을 반복 합 니 다.
그 알고리즘 은 다음 과 같이 설명 할 수 있다.
이 문제 에서 그림 이 없 는 인접 행렬 (즉 배열 표시) 을 읽 고 방향 이 없 는 그림 을 만 들 고 상기 설명 에서 의 알고리즘 에 따라 모든 정점 을 옮 겨 다 니 며 출력 이 정점 을 옮 겨 다 니 는 순서 입 니 다.
입력 설명
입력 한 첫 줄 은 정수 n 을 포함 하고 그림 에 n 개의 정점 이 있 음 을 나타 낸다.그 중 n 은 50 을 넘 지 않 는 다.
이후 n 줄 마다 n 개의 빈 칸 으로 구 분 된 정수 0 또는 1 이 있 고 i 줄 의 j 번 째 0 또는 1 에 대해 1 은 i 번 째 정점 과 j 번 째 정점 이 직접 연결 되 어 있 음 을 나타 내 며 0 은 직접 연결 되 지 않 았 음 을 나타 낸다.i 와 j 가 같 을 때 대응 하 는 정 수 는 0 이다.
입력 은 인접 행렬 이 대칭 행렬 임 을 보증 합 니 다. 즉, 입력 한 그림 은 반드시 방향 이 없 는 그림 입 니 다.
출력 설명
n 개의 정 수 를 포함 하 는 줄 만 있 습 니 다. 제목 설명 에 있 는 넓 은 범위 에 따라 전체 그림 의 방문 정점 순 서 를 우선 옮 겨 다 니 는 것 을 의미 합 니 다.정수 마다 빈 칸 을 출력 하고 줄 끝 출력 줄 바 꾸 기 에 주의 하 십시오.
샘플 입력 4 0 0 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0
출력 샘플 0, 3, 1, 2
 
 //               
#include
#include
#include

int n, k, l;
int a[55][55];
int b[55];
int ans[55];

void DFS(int x)
{

    int i, j;
    if(b[x] == 1)
    {
        ans[k++] = x;
        b[x] = 0;
    }

   if(k == n)
    {
        for(i = 0; i < n; i++)
        {

            printf("%d ", ans[i]);
        }
        printf("
"); exit(0); } for(i = 0; i < n; i++) { if(a[x][i] == 1 && b[i] == 1) { ans[k++] = i; b[i] = 0; } } DFS(ans[++l]); return ; } int main() { int i, j; scanf("%d", &n); { for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } k = 0; l = 0; for(j = 0; j < n; j++) b[j] = 1; for(i = 0; i < n; i++) { if(b[i] == 1) { DFS(i); } } } return 0; }

좋은 웹페이지 즐겨찾기