일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- BlockChain
- Fast API
- Thread
- 이더리움
- 러스트
- Network
- 전문가를 위한 파이썬
- RabbitMQ
- Container
- Refactoring
- docker
- Ethereum
- guru
- function
- AWS
- Kubernetes
- 블록체인
- dockerfile
- IMAGE
- 플랫폼
- 동시성
- 코어 이더리움 프로그래밍
- 파이썬
- Python
- fluent python
- 백준
- rust
- 알고리즘
- Algorithm
- BAEKJOON
- Today
- Total
글쓰기 | 방명록 | 관리 |
Victoree's Blog
1922_네트워크의 연결 본문
Concept & Idea
당연히 이 문제를 DFS로 풀면 시간초과가 엄청 날 것이다.(1000의 100000승?) 이 문제는 최소 스패닝 트리를 구하는 문제로, Prim 알고리즘을 이용하여 해결할 수 있었다. 우선순위 큐를 문제에서 해결하는 것은 처음이었기 때문에, 다소 생소했으나 대체적으로 큐와 동일하였다.
struct node { int x,y,z; bool operator() (node a, node b) { return a.z>b.z; //최소값 우선 노드 } };
이 노드를 만듬으로써, operator를 통해 comp함수까지 대체할 수 있었다.
priority_queue<node, vector, node> pqu;
이 코드는 priority_queue를 선언하는 코드인데, 첫번째는 queue의 타입, 두번째 변수인 vector는 priority_queue가 벡터처럼 구현되어서 넣는 코드란다.. 컨테이너? 세번째 변수는 comp함수가 들어가는 곳인데, node 구조체 안에 생성한 operator() 함수를 통해서 선언할 수 있었다.
Code
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {
int x,y,z;
bool operator() (node a, node b) {
return a.z>b.z; //최소값 우선 노드
}
};
vector<pair<int, int>> vec[1001]; //node, cost 순
bool check[1001];
int n,line,res=0;
priority_queue<node, vector<node>, node> pqu;
int main(){
cin>>n>>line;
for(int i=0; i<line; i++) {
int a,b,c;
cin>>a>>b>>c;
vec[a].push_back({b,c});
vec[b].push_back({a,c});
}
for(int i=0; i<vec[1].size(); i++) {
node temp;
temp.x=1; temp.y=vec[1][i].first; temp.z=vec[1][i].second;
pqu.push(temp);
}
check[1]=true;
while(!pqu.empty()) {
node temp = pqu.top();
pqu.pop();
if(!check[temp.y]) {
check[temp.y]=true;
res+=temp.z;
for(int i=0; i<vec[temp.y].size(); i++) {
if(!check[vec[temp.y][i].first]) {
node k;
k.x=temp.y; k.y=vec[temp.y][i].first; k.z=vec[temp.y][i].second;
pqu.push(k);
}
}
}
}
cout<<res<<endl;
}
Fealing
처음으로 우선 순위 큐를 이용하여, 그 중에서도 Prim 알고리즘을 이용하여 문제를 해결하였다.
처음에 어떻게 해결할까 생각했을 때, DFS가 떠올랐고, 컴퓨터의 수 N이 1000이고 간선의 수가 100000이어서 1000^100000은 무조건 시간초과이기에 바로 접었다.
그러고 생각한 방법이 최솟값만 찾아서 연결하면 되겠다! 였는데, 추가된 노드와 연결된 최소값만 연결한다고 문제가 해결되는 것은 아닌 것 같았다.
So! 내가 현재 연결된 모든 노드와 연결된 간선들 중 최솟값을 추가해나가는 방식으로 문제를 해결할 수 있을 것 같았고, 최소 스패닝 트리를 구하는 Prim 알고리즘을 사용하여 문제를 해결할 수 있었다.
'Algorithm > 2019~2020' 카테고리의 다른 글
1937_욕심쟁이 판다 (0) | 2021.04.23 |
---|---|
1389_케빈 베이컨의 6단계 법칙 (0) | 2021.04.23 |
1300_K번째수 (0) | 2021.04.23 |
3020_개똥벌레 (0) | 2021.04.23 |
2110-공유기 설치 (0) | 2021.04.23 |