Koder / 박성훈
article thumbnail

간선을 생으로 구현하면 MLE가 나오는 문제

간선의 갯수를 줄이기 위해서는

더미노드를 만들어서

하이퍼 튜브가 문어발 같은 느낌으로 펼쳐지게 설계해주면 된다.

그러면 모든 노드를 최소한의 간선만 가지고( 정점을 하나 더 써서 )

이어줄 수 있고,

 

테스트케이스의 정답을 더미노드를 사용해서

문제를 해결하면

 

1 K 3 K 6 K 9 가 되는데,

정답, 즉 4를 N이라 하면

더미노드 K의 갯수는 N-1개 이다.

따라서 실제 정답은

우리가 bfs를 통해 구해준 가중치를 K로 두었을때

(K+1)/2를 출력해주면

답이 된다.

 

메모리 아끼는 팁으로는

가중치를 vis배열이랑 같이 묶어서

한번에 저장해줄 수 있다는 정도?

위의 더미노드를 만든다는 생각에만 도달하면 쉽게 AC를 받을 수 있다.

 

더보기
#include <bits/stdc++.h>

using namespace std;

vector<int> edge[123456];
int vis[123456] = {0};
queue<int> q;

int main(){
	int n,k,m;
	int tmp;
	scanf("%d %d %d", &n, &k, &m);
	for(int i=n+1; i<m+n+1; i++){
		for(int j=0; j<k; j++){
			scanf("%d", &tmp);
			edge[i].push_back(tmp);
			edge[tmp].push_back(i);
		}
	}
	
	int node;
	q.push(1);
	vis[1] = 1;
	
	while(!q.empty()){
		node = q.front();
		q.pop();
		       
		for(int i=0; i<edge[node].size(); i++){
			if( vis[edge[node][i]] == 0 ){
				q.push(edge[node][i]);
				vis[edge[node][i]] = vis[node]+1;
			}
		}
	}
	if(vis[n] == 0) printf("-1");
	else printf("%d", (vis[n]+1)/2);
	return 0;
}

반응형