https://school.programmers.co.kr/learn/courses/30/lessons/86971
1. int dfs 자식수세기
지역변수로 ret=1
ret+=dfs(next)
return ret 하면된다.
int dfs(int node){
visited[node]=1;
int ret=1;
for(int next=0;next<104;++next){
if(adj[node][next]==0) continue; //연결이아니면 pass
if(adj[next][node]==0) continue; //연결이아니면 pass
if(visited[next]) continue;
ret+=dfs(next);
}
return ret;
}
전체코드
#include <bits/stdc++.h>
using namespace std;
int visited[104];
int adj[104][104];
int dfs(int node){
visited[node]=1;
int ret=1;
for(int next=0;next<104;++next){
if(adj[node][next]==0) continue; //연결이아니면 pass
if(adj[next][node]==0) continue; //연결이아니면 pass
if(visited[next]) continue;
ret+=dfs(next);
}
return ret;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 987654321;
//1. 1개씩 연결끊기
//2. dfs 돌면서 연결된 노드세기
//3. 최대값 차이 갱신
//4. 시간복잡도 : n(for)*n(for)*n(dfs)==1000000 가능
//연결해주기
for(auto v : wires){
adj[v[0]][v[1]]=1;
adj[v[1]][v[0]]=1;
}
for(auto v : wires){
//1. visit 초기화
fill(visited,visited+104,0);
adj[v[0]][v[1]]=0;
adj[v[1]][v[0]]=0;
vector<int> temp;
for(int i=1;i<=n;++i){
if(visited[i]) continue;
temp.push_back(dfs(i));
}
// for(auto i : temp){
// cout<<i<<" ";
// }
// cout<<"\n";
answer=min(answer,abs(temp[0]-temp[1]));
//탐색끝나면 다시연결해주기
adj[v[0]][v[1]]=1;
adj[v[1]][v[0]]=1;
}
return answer;
}
'Algorithm > dfs' 카테고리의 다른 글
프로그래머스 미로탈출명령어 c++ // dfs 가지치기 방법, dfs중복방문 방법, dfs 시간복잡도 계산방법 (0) | 2023.12.02 |
---|---|
백준 1759 암호만들기 c++ // 포함불포함 완탐 dfs, 순열시간초과 나는경우 해결 (0) | 2023.11.26 |
프로그래머스 단어변환 c++ dfs ,백트래킹 // dfs 조건있는경우 해결방법 (0) | 2023.10.18 |
프로그래머스 네트워크 c++ // 인접행렬 dfs (0) | 2023.09.13 |
프로그래머스 타겟넘버 c++ // dfs (0) | 2023.09.13 |