Programming

[BOJ] 11085 군사 이동

minigb 2021. 4. 26. 11:52

(2021년 1월 24일에 작성한 글입니다.)

 

 

11085번: 군사 이동

전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다. Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다. 모든 길은 양방향이며, 각 길마다 너비가 존재하여

www.acmicpc.net

(20.08.09)

c부터 v까지 DFS를 계속 돌면서 체크하도록 했더니 시간초과.
경로가 존재하는지만 확인을 하면 되기 때문에
Union-Find(DST)를 사용하면 훨씬 간단하다!!!

우왕 짱 신기

그리고!! structure를 이용해서 푼 첫 문제인거 같다 아마
짱신기!!!!!
이제 앞으로 벡터 쓸때 pair를 여러개 하지 않아도 된다...ㅋㅋㅋㅋㅋ
앞으로 structure를 애용하게 될 거 같다

 

 

라고 과거의 내가 적어놓은 걸 봤다.

 

​한동안 MST를 완전히 잊고 살고 있었구나...

어떻게 푸는지 모르겠어서

예전에 짠 코드를 보고 이해했다...

그때의 내가 꽤 똑똑했구나.

MST의 최대 버전이라고 생각하면 된다

width가 큰 것부터 간선을 뽑아준 다음에

경로가 생성 됐으면 맨 마지막에 뽑은 간선의 width가 답이 된다...

진짜

신기가 방기다..!

struct Edge {
	int start, end, width;
};

bool sortby(Edge a, Edge b) {
	return a.width > b.width;
}

vector<int> par;
int GetPar(int);
void Merge(int, int);


int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int P, W;
	int C, V;

	cin >> P >> W
		>> C >> V;
	vector<Edge> edges(W + 5);
	for (int i = 0; i < W; i++) {
		cin >> edges[i].start >> edges[i].end >> edges[i].width;
	}
	sort(edges.begin(), edges.begin() + W, sortby);

	par.resize(P + 5, -1);

	for (int i = 0; i < W; i++) {
		Merge(edges[i].start, edges[i].end);
		if (GetPar(C) == GetPar(V)) {
			cout << edges[i].width << ENDL;
			break;
		}
	}

	return 0;
}

int GetPar(int x)
{
	if (par[x] == -1) {
		return x;
	}
	return par[x] = GetPar(par[x]);
}

void Merge(int x, int y)
{
	x = GetPar(x);
	y = GetPar(y);
	
	if (x != y) {
		par[x] = y;
	}
}