Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1967. ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1967. ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

bba_dda 2021. 6. 29. 20:43
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ 

https://www.acmicpc.net/problem/1967

 

1967๋ฒˆ: ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n(1 ≤ n ≤ 10,000)์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n-1๊ฐœ์˜ ์ค„์— ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ •์ˆ˜๋Š” ๊ฐ„์„ ์ด ์—ฐ

www.acmicpc.net

 

ํ’€์ด 

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒ€์ƒ‰์„ ์ข€ ํ•ด๋ณด์•˜๋Š”๋ฐ, ๊ณต์‹์ฒ˜๋Ÿผ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ–ˆ๊ณ , ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฆ๋ช…ํ•ด๋†“์€ ๊ธ€๋“ค๋„ ๋งŽ์•˜๋‹ค. 

https://blog.myungwoo.kr/112 (์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ)

 

[ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜]

1. ์ž„์˜์˜ ์ •์  x๋ฅผ ์žก๋Š”๋‹ค. (๋ณดํ†ต ๋ฃจํŠธ๋กœ ์žก์Œ)

2. x์—์„œ ๊ฐ€์žฅ ๋จผ ์ •์  y๋ฅผ ์ฐพ๋Š”๋‹ค.

3. y์—์„œ ๊ฐ€์žฅ ๋จผ ์ •์  z๋ฅผ ์ฐพ๋Š”๋‹ค.

4. ์ง€๋ฆ„์€ y-z ์‚ฌ์ด์˜ ๊ฒฝ๋กœ(๊ฑฐ๋ฆฌ)์ด๋‹ค. 

 

๊ทธ์น˜๋งŒ ๋‚ด ๋จธ๋ฆฌ๋กœ๋Š” ๊ธ€๋กœ ๋œ ์ฆ๋ช…์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์–ด์„œ ์ง์ ‘ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด์•˜๋”๋‹ˆ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค! 

 

์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž! ๊ทธ๋ฆผ์— ํ‘œ์‹œํ•œ y-z๊ฐ€ ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„์ด๋‹ค. 

๋ฃจํŠธ๋ฅผ x๋กœ ์žก๊ณ  ๋ฃจํŠธ์—์„œ ๊ฐ€์žฅ ๋จผ ์ •์  y๋ฅผ ์ฐพ๊ณ , y์—์„œ ๊ฐ€์žฅ ๋จผ ์ •์  z๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ, ๊ฐ™์€ ํŠธ๋ฆฌ์—์„œ ์ง„ํ•œ ์ดˆ๋ก์ƒ‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž 

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค. ์ด๋Ÿฐ ๋ชจ์–‘์˜ ํŠธ๋ฆฌ์—์„œ๋„ ์—ญ์‹œ ๋ฃจํŠธ๋ฅผ x๋กœ ์žก์œผ๋ฉด, 

x์—์„œ ๊ฐ€์žฅ ๋จผ z๋ฅผ ์ฐพ๊ฒŒ๋˜๊ณ , z์—์„œ ๊ฐ€์žฅ ๋จผ y๋ฅผ ๊ตฌํ•ด์„œ z-y์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ง€๋ฆ„์ด ๋œ๋‹ค. 

์ฆ๋ช…์ด ์ข€ ์ด์ƒํ•œ๊ฑฐ ๊ฐ™๊ธด ํ•˜์ง€๋งŒ, ๋Œ€๊ฐ• ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด๋‹ˆ ๋งž๋Š” ์ฆ๋ช…์ธ๊ฑฐ ๊ฐ™๋‹ค! ๋ผ๋Š”๊ฒŒ ๊ฒฐ๋ก ์ด๋‹ค..ใ…Žใ…Ž

 

๊ทธ๋ž˜์„œ ์ด์ œ ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, DFS๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋ฌธ์ œ์— ๋ฃจํŠธ๋…ธ๋“œ๋Š” ํ•ญ์ƒ 1์ด๋ผ๊ณ  ์ •ํ•ด์ฃผ์—ˆ์œผ๋‹ˆ๊นŒ 

1๋ถ€ํ„ฐ DFS๋Œ๋ ค์„œ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ , ์ด๋ ‡๊ฒŒ ์ฐพ์€ ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋‹ค์‹œ DFS๋ฅผ ๋Œ๋ฆฌ๋ฉด, ๋‘˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ •๋‹ต์ด๋‹ค.

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

int N;
vector<pair<int,int>> graph[10001];
bool visited[10001] = { 0, };
int maxCost=0;
int node;

void DFS(int start, int cost) {
	visited[start] = 1;
	for (int i = 0;i < graph[start].size();i++) {
		if (!visited[graph[start][i].first]) {
			DFS(graph[start][i].first, cost+graph[start][i].second);
			if (cost+graph[start][i].second > maxCost) {
				maxCost = cost+graph[start][i].second;
				node = graph[start][i].first;
			}
		}
	}
}

int main() {
	cin >> N;
	for (int i = 0;i < N-1;i++) {
		int parent, child, cost;
		cin >> parent >> child >> cost;
		graph[parent].push_back(make_pair(child, cost));
		graph[child].push_back(make_pair(parent, cost));
	}

	DFS(1,0); //root์—์„œ dfs

	//์ดˆ๊ธฐํ™” 
	maxCost = 0;
	fill(&visited[0], &visited[10001],0);

	// root์—์„œ ๊ฐ€์žฅ ๋จผ node๋ถ€ํ„ฐ ๋‹ค์‹œ dfs
	DFS(node, 0);
	
	int result = maxCost;
	cout << result << endl;

	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•