선인장 접기

시간 제한3초메모리 제한1024 MB

요약
선인장 그래프의 각 정점에 좌표를 배정해 모든 간선의 길이가 두 좌표 차의 절댓값과 같아지도록 만들 수 있는지 판정합니다.
난이도

보통10점 중 7점

유형
그래프, DFS, 유니온 파인드, 구현
정답자
아직 제출이 없습니다

문제

선인장 그래프란 모든 간선이 최대 하나의 단순 사이클에만 포함된 무향 그래프를 의미합니다. 흐즈로는 선인장 그래프를 하나 가지고 있으며, 각 간선에는 길이가 있습니다. 두 정점 uu, vv를 연결하며 길이가 ll인 간선을 순서쌍 (u,v,l)(u,v,l)로 표기합니다. 문득 흐즈로는 자신의 그래프를 보다가 이러한 생각을 하게 되었습니다.

  • 어떤 선인장 그래프는 적당히 접어서 1차원으로 만들 수도 있지 않을까?

이 의문을 해결하기 전, 다음의 성질을 만족하는 그래프를 접어서 1차원으로 만들 수 있다고 정의합시다.

  • 각 정점 ii에 1차원 좌표 x_ix\_i를 배정하여, 각 간선 (u,v,l)(u,v,l)에 대해 ∣x_u−x_v∣=l|x\_u-x\_v|=l이 성립하도록 할 수 있습니다.

이제 여러분이 해결해야 하는 문제는 다음과 같습니다. 입력으로 흐즈로가 가진 선인장 그래프가 주어집니다. 이 그래프를 접어서 1차원으로 만들 수 있는지 판단해 주세요.

입력

첫 번째 줄에 그래프의 정점의 개수 nn과 간선의 개수 mm이 공백으로 분리되어 주어집니다. (1≤n≤105,0≤m≤min⁡(⌊1.5(n−1)⌋,105)1 \le n \le 10^5, 0 \le m \le \min(\lfloor 1.5(n-1) \rfloor,10^5))

두 번째 줄부터 총 mm개의 줄에 간선의 정보가 한 줄에 하나씩 주어집니다. 그 중 ii번째 줄에는 ii번째 간선이 연결하는 두 정점 u_iu\_i와 v_iv\_i, 그리고 간선의 길이 l_il\_i이 공백으로 분리되어 주어집니다. (1≤u_i,v_i≤n1 \le u\_i,v\_i \le n, u≠vu \neq v, 0≤l_i≤500 \le l\_i \le 50)

주어진 그래프는 중복 간선이나 자기 자신을 향하는 간선을 포함하지 않으며, 선인장 그래프임이 보장됩니다.

출력

그래프를 접어서 1차원으로 만들 수 있다면, 한 줄에 YES를 출력하세요. 그렇지 않다면 NO를 출력하세요.

힌트

본 문제에서 정의하는 선인장 그래프는 연결 그래프가 아닐 수 있음에 주의하세요.

예제2

  1. 예제 1

    입력
    6 6
    1 2 2
    2 3 4
    3 4 3
    4 5 2
    2 5 1
    5 6 7
    
    예상 출력
    YES
    
  2. 예제 2

    입력
    6 6
    1 2 2
    2 3 4
    3 4 3
    4 5 2
    2 4 2
    5 6 7
    
    예상 출력
    NO