알고리즘

[C++] SWEA 최장 경로

jordancancode 2024. 11. 13. 17:36

출처

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7GOPPaAeMDFAXB

 

 

 

풀이

#include <bits/stdc++.h>
using namespace std;

int result = 0;
map<int, vector<int>> nodes;

void dfs(int start, vector<bool> visited, int cnt) {
	visited[start] = true;
	for (int next : nodes[start]) {
		if (!visited[next]) {
			dfs(next, visited, cnt + 1);
		}
	}
	if (result < cnt){
		result = cnt;
		return;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int T;
	cin >> T;
	for (int t = 1; t <= T; t++)
	{
		int N, M;
		cin >> N >> M;
		vector<bool> visited(N+1, false);
		for (int i = 0; i < M; i++) {
			int a, b;
			cin >> a >> b;
			nodes[a].push_back(b);
			nodes[b].push_back(a);
		}
		for (int n = 1; n <= N; n++) {
			dfs(n, visited, 1);
			fill(visited.begin(), visited.end(), false);
		}
		cout << "#" << t << " " << result << endl;
		nodes.clear();
		result = 0;
	}
}

 

간단하고 재밌는 DFS 문제.

반례가 겹치지 않도록 visited를 인수로 받아서 관리하자.

1번 노드 뿐만 아니라, 다른 노드의 기준에서 최장 경로를 가질 수 있음에 유의하자.

반응형