본문 바로가기
알고리즘

[그래프][DFS]그래프의 모든 간선 지나기

by 차분한 공돌이 2024. 2. 19.

문제

그래프의 모든 간선을 DFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 정점 번호는 1번부터 N번까지이다.

 

 

입력

첫째 줄에 정점의 개수 n, 간선의 개수 k가 주어진다. 다음 k개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 입력으로 주어지는 간선은 양방향이다.

 

출력

방문된 점을 순서대로 출력하면 된다.

 

예시)

 

 

코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int A[50][50] = { 0 }; //인접행렬 만들 2차원 배열, 인접행렬 : 그래프의 연결 방식을 표시
int n, k, a, b;
int check[50][50] = {0}; //체크배열 : 지나간 간선을 표시
int R[50] = { 0 }; //report배열 : 지나간 노드를 순서대로 표시

void input() {  //인접행렬 만들기
	scanf("%d %d", &n, &k);
	for (int i = 1; i <= k; i++) {
		scanf("%d %d", &a, &b);
		A[a][b] = 1; //간선이 양방향이기 때문에 대칭으로 인접행렬 만들기
		A[b][a] = 1;


	}
}
void q(int os,int s, int L) {
	check[os][s] = 1; //지나간 간선 표시
	check[s][os] = 1; //지나간 간선 표시
	R[L] = s; //지나간 노드 표시


	//출력조건 : 지나간 간선의 개수가 주어진 간선의 개수와 일치하면 출력
	if (L == k) { 
		for (int i = 0; i <= k; i++) {
			
			printf("%c",R[i]+64); //아스키 코드를 이용하여 1:A, 2: B.... 로 출력
				


		}
		//for(int i = 1; )
		printf("\n");
		
		//리셋 : 리턴하기 전에 현재 간선을 체크배열에서 삭제
		check[os][s] = 0;
		check[s][os] = 0;
		return;
	}

	//n진 트리 : 존재하는 모든 노드 중 현재 노드와 연결되어 있고, 지나가지 않은 간선으로 연결되어 있는 노드들로 이동함
	for (int e = 1; e <= n; e++) {
		if (A[s][e] == 1 && check[s][e] == 0)q(s,e, L + 1);
	}

	//현재 위치에서 더 이상 움직일 간선이 없으모로 현재 간선을 체크배열에서 삭제
	check[os][s] = 0;
	check[s][os] = 0;


}

int main() {
	input();
	for (int s = 1; s <= n; s++) {
		R[0] = s;
		for (int e = 1; e <= n; e++) {
			if (A[s][e] == 1 && check[s][e] == 0)q(s, e, 1);
		}
	}
	
	return 0;

}

 

입력 출력

'알고리즘' 카테고리의 다른 글

n진트리, 4 방향으로 이동경로 출력  (0) 2024.02.19