반응형

 

먼저, 주어진 노선에서 사이클을 형성하는 역들을 찾아서 기억해줍니다.

사이클을 형성하는 역 중 하나를 선택해서, 그 지점부터 BFS를 수행합니다.

 

#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

vector<int> graph[3001];
int n, a, b;
int dist[3001] = { 0 };
bool cycle[3001] = { false };
bool visit[3001] = { false };

int dfs(int node, int prev) {
	if (visit[node]) return node; // 이미 방문한 역이면 사이클
	visit[node] = true;
	for (int i = 0; i < graph[node].size(); i++) {
		if (prev == graph[node][i]) continue;
		int ret = dfs(graph[node][i], node);
		if (ret > 0) {
			cycle[node] = true;
			if (ret == node) return -node; // 이 지점까지가 사이클을 형성. 음수로 반환
			else return ret;
		}
		else if(ret < 0) return ret; // 사이클을 형성하는 역 중 하나 반환
	}
	return 0;
}

void bfs(int start) { // start : 사이클을 형성하는 역 중 하나
	memset(visit, false, sizeof(visit));
	queue<int> q;
	q.push(start);
	visit[start] = true;
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (int i = 0; i < graph[x].size(); i++) {
			if (visit[graph[x][i]]) continue;
			visit[graph[x][i]] = true;
			dist[graph[x][i]] = dist[x] + !cycle[graph[x][i]];
			q.push(graph[x][i]);
		}
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d %d", &a, &b);
		graph[a].push_back(b);
		graph[b].push_back(a);
	}
	bfs(-dfs(1, -1));
	for (int i = 1; i <= n; i++) printf("%d ", dist[i]);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 1915 : 가장 큰 정사각형  (0) 2021.11.17
백준 2109 : 순회강연  (0) 2021.11.17
백준 14938 : 서강그라운드  (0) 2021.11.17
백준 2922 : 즐거운 단어  (0) 2021.11.17
백준 1600 : 말이 되고픈 원숭이  (0) 2021.11.16

+ Recent posts