[삼성 sw 파이썬] 2814 최장 경로
문제
N개의 정점과 M개의 간선으로 구성된 가중치가 없는 무방향 그래프에서 최장 경로의 길이를 계산하자.
정점의 번호 1부터 N번까지 순서대로 부여된다.
경로에는 같은 정점의 번호가 2번 이상 등장할 수 없다 경로 상의 인접한 점들 사이에는 반드시 간선이 존재한다.
경로의 길이는 경로 상에 등장하는 정점의 개수를 나타낸다.
입력
첫 줄에는 테스트케이스가 주어진다.
각 테스트 케이이스의 첫 번 줄에는 두 개의 자연수 N, M이 주어진다.
두 번째 줄부터 M개의 줄에 걸쳐서 그래프의 간선 정보를 나타낸다.
풀이
문제에서 가중치가 없는 무방향 그래프라고 주어졌으면 경로상의 가장 경로를 탐색하는 완전 탐색 문제로
DFS나 BFS를 이용아여 문제를 풀 수 있다.
나는 DFS르 이용하여 문제를 풀었다.
def dfs(s,count):
global ans
if ans<count:
ans=count
v[s]=True
for i in g[s]:
if not v[i]:
dfs(i,count+1)
v[i]=False
일반적인 DFS코드와는 다르게 방문하고 나면 그 루트 탐색이 끝나면 방문했던걸 지워야 한다 왜냐하면 다른 간선을 이용하여 그 정점에 도달할 수 있기 때문이면 우리가 찾아야 하는 거는 최장 거리이기 이에 DFS가 반복할 때만 COUNT값을 +1을 해주면 최댓값을 계속하여 찾을 수 있다.
또한 DFS를 모든 정점에서도 다 돌려야 한다.
1번 정점에서도 돌려보고 2번 정점에서도 돌려봐야지 가장 긴 거리를 알 수 있다.
코드
def dfs(s,count):
global ans
if ans<count:
ans=count
v[s]=True
for i in g[s]:
if not v[i]:
dfs(i,count+1)
v[i]=False
test=int(input())
for t in range(test):
n,m=map(int,input().split())
g=[[] for _ in range(n+1)]
ans=0
for i in range(m):
a,b=map(int,input().split())
g[a].append(b)
g[b].append(a)
for j in range(1,n+1):
v=[False]*(n+1)
dfs(j,1)
print(f"#{t+1} {ans}")
반응형
'파이썬 문제풀이 > DFS,BFS' 카테고리의 다른 글
[삼성sw 파이썬] 14413 격자판 칠하기 (1) | 2024.11.04 |
---|---|
[파이썬 삼성sw] 6057 그래프의 삼각형 (3) | 2024.10.20 |
[백준 파이썬] 1389 케빈 베이컨의 6단계 법칙 (2) | 2024.09.16 |
[백준 파이썬] 14502번 연구 (0) | 2024.05.07 |
[백준 파이썬] 1325 효율적인 해킹 (0) | 2024.03.16 |