RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
포럼
KOI00062

그래프 균형 맞추기

Platinum III 플래티넘 III
난이도
2s
시간 제한
1024MB
메모리 제한
1
맞았습니다!!
1
제출 수
100.0%
정답률
레이팅

의견: 0

설명

N개의 정점과 M개의 간선으로 구성된 무방향 단순 연결 그래프가 있다. 그래프의 정점들에는 1 이상 N 이하의 서로 다른 자연수 번호가 붙어 있고, 간선들에는 1 이상 M 이하의 서로 다른 자연수 번호가 붙어 있다.

j (\(1 \le j \le M\))번 간선은 \(a_{j}\)번 정점과 \(b_{j}\)번 정점을 연결하며, 정수 가중치 \(c_{j}\)가 붙어 있다.

당신은 모든 정점에 정수 가중치를 부여해야 한다. i (\(1 \le i \le N\))번 정점에 부여할 가중치를 \(x_{i}\)라고 하자.

정점에 가중치를 부여하는 총 비용은 각 정점의 가중치의 절댓값의 합, 즉 \(|x_{1}| + |x_{2}| + \cdots + |x_{N}|\)과 같다.

그래프의 균형이 맞으려면, 각 간선이 연결하고 있는 두 정점의 가중치의 합이 간선의 가중치와 같아야 한다. 즉, 모든 j (\(1 \le j \le M\))에 대해, x\(a_{j}\) + x\(b_{j}\)\(c_{j}\)와 같아야 한다.

예를 들어, 아래와 같이 5개의 정점과 4개의 간선으로 이루어진 그래프를 생각하자. 그림에서 정점을 나타 내는 원 안에 적힌 수는 정점의 번호이고, 간선을 나타내는 선에 적힌 수는 간선에 붙은 가중치이다.

아래의 그림과 같이 각 정점에 [2, -7, 3, -5, 0]의 가중치를 부여해서, 각 간선이 연결하고 있는 두 정점의 가중치의 합이 간선의 가중치와 같게 할 수 있다. 아래 그림에서 정점을 나타내는 원 안에 적힌 수는 정점의 가중치이다.

총 비용은 |2| + | − 7| + |3| + | − 5| + |0| = 2 + 7 + 3 + 5 + \(0 = 17\)이다. 총 비용을 17보다 작게 할 수 있는 방법은 없기 때문에, 위 방법은 총 비용을 최소화하는 방법이다.

아래와 같이 각 정점에 [6, -3, -1, -9, 4]의 가중치를 부여해도 균형이 맞는 그래프가 되지만, 이 경우 총 비용은 17보다 큰 23이 되기 때문에 아래 방법은 총 비용을 최소화하는 방법이 아니다.

그래프의 균형이 맞도록 정점에 가중치를 부여하는 것이 가능한지 확인하고, 가능하다면 그 중 총 비용을 최소화하는 방법을 하나 구하는 프로그램을 작성하라.

Hint.

|x|는 x < 0이면 −x, \(x \ge 0\)이면 x인 절댓값 기호이다.

제약

참고: \(|x|\)\(x < 0\)이면 \(-x\), \(x \ge 0\)이면 \(x\)인 절댓값 기호이다.

  • 주어지는 모든 수는 정수이다.
  • \(2 \le N \le 100\,000\)
  • \(1 \le M \le 200\,000\)
  • 모든 \(j\) (\(1 \le j \le M\)) 에 대해:
  • \(1 \le a_j \le N\), \(1 \le b_j \le N\)
  • \(a_j \ne b_j\). 즉, 서로 같은 두 정점을 연결하는 간선은 없다.
  • \(-1\,000\,000 \le c_j \le 1\,000\,000\)
  • 모든 \(j, k\) (\(1 \le j < k \le M\)) 에 대해, \(\{a_j, b_j\} \ne \{a_k, b_k\}\). 즉, 서로 다른 두 정점 쌍 \((a, b)\) 를 잇는 간선은 많아야 한 개 존재한다.
  • 그래프는 연결 그래프이다. 즉, 그래프에서 어떤 두 정점을 골라도, 간선들을 통해 두 정점을 직, 간접적으로 잇는 경로가 존재한다.
입력 형식

첫째 줄에 N과 M이 순서대로 공백을 사이에 두고 주어진다.

다음 M개의 줄에 각 간선에 대한 정보가 주어진다. 이 중 j (\(1 \le j \le M\))번째 줄에는 세 정수 \(a_{j},b_{j},c_{j}\)가 공백 하나씩을 사이로 두고 주어진다.

출력 형식

만약 그래프의 균형이 맞도록 정점에 정수 가중치를 부여하는 방법이 존재한다면:

  • 첫째 줄에 Yes를 출력한다. 출력은 대소문자를 구분하지 않는다.
  • 둘째 줄에 각 정점에 부여한 가중치를 나타내는 N개의 정수 \(x_{1},x_{2}\), . . ., \(x_{N}\)을 공백 하나씩 사이에 두고 출력한다. 그래프의 균형이 맞도록 하면서 총 비용을 최소화하는 방법이 여럿 존재한다면, 그러한 방법들 가운데 어떤 것을 출력해도 된다.

만약 그래프의 균형이 맞도록 정점에 정수 가중치를 부여하는 방법이 존재하지 않는다면:

  • 첫째 줄에 No를 출력한다. 출력은 대소문자를 구분하지 않는다.
서브태스크
서브태스크점수설명

1

6점

\(N = 3, M = 3\) 이고, 세 개의 간선은 \(1\)번과 \(2\)번, \(2\)번과 \(3\)번, \(3\)번과 \(1\)번 정점을 각각 잇고 있다.

2

10점

\(N \le 1\,000\) 이고, \(M = N - 1\) 이고, \(j\)번 간선(\(1 \le j \le M\))은 \(j\)번 정점과 \(j + 1\)번 정점을 잇고 있다.

3

11점

\(M = N - 1\) 이고, \(j\)번째 간선(\(1 \le j \le M\))은 \(j\)번 정점과 \(j + 1\)번 정점을 잇고 있다.

4

12점

\(M = N - 1\) 이다.

5

13점

\(M = N\) 이고, 모든 정점은 정확히 서로 다른 두 개의 간선과 이어져 있다.

6

29점

\(N \le 1\,000\) 이다.

7

19점

추가 제약 조건 없음.

예제 1
입력
3 3
1 2 5
2 3 4
3 1 3
출력
Yes
2 3 1
예제 2
입력
5 4
1 3 5
2 3 -4
4 2 -12
5 3 3
출력
Yes
2 -7 3 -5 0
문제 정보

riseoj 작성

출처 올림피아드 > 한국정보올림피아드 > KOI 2021 > 2차 대회 > 초등부 4번 / 고등부 2번

평가 및 의견

그래프 균형 맞추기

개요
출제자 난이도 Platinum III 플래티넘 III 의견 0 / 50 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

그래프 균형 맞추기

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8