1. λ¬Έμ
μΆμ²:https://school.programmers.co.kr/learn/courses/30/lessons/86971
nκ°μ μ‘μ νμ΄ μ μ μ ν΅ν΄ νλμ νΈλ¦¬ ννλ‘ μ°κ²°λμ΄ μμ΅λλ€. λΉμ μ μ΄ μ μ λ€ μ€ νλλ₯Ό λμ΄μ νμ¬μ μ λ ₯λ§ λ€νΈμν¬λ₯Ό 2κ°λ‘ λΆν νλ €κ³ ν©λλ€. μ΄λ, λ μ λ ₯λ§μ΄ κ°κ² λλ μ‘μ νμ κ°μλ₯Ό μ΅λν λΉμ·νκ² λ§μΆκ³ μ ν©λλ€.
μ‘μ νμ κ°μ n, κ·Έλ¦¬κ³ μ μ μ 보 wiresκ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§λλ€. μ μ λ€ μ€ νλλ₯Ό λμ΄μ μ‘μ ν κ°μκ° κ°λ₯ν λΉμ·νλλ‘ λ μ λ ₯λ§μΌλ‘ λλμμ λ, λ μ λ ₯λ§μ΄ κ°μ§κ³ μλ μ‘μ ν κ°μμ μ°¨μ΄(μ λκ°)λ₯Ό return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
2. μ½λ
#include <string>
#include <vector>
using namespace std;
//dfs, visited λ°©λ²
int graph[101][101];
int visited[101];
int dfs(int cur, int n)
{
if(visited[cur]) return 0; //νλ² λ°©λ¬Έν κ³³μ μ¬λ°©λ¬Έ X
int child=1; //νμ λ
Έλμ κ°―μ
visited[cur]=true;
for(int i=1;i<=n;i++)
{
if(graph[cur][i]) //μ°κ²°, κ°μ μλ κ³³λ§
{
child+=dfs(i,n);
}
}
return child;
}
void setGraph(int x,int y,int value)
{
graph[x][y]=value;
graph[y][x]=value;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 101;
//μ°κ²°λμ΄ μλ λͺ¨λ μ‘μ ν 1λ‘ μ΄κΈ°ν
for(int i=0;i<wires.size();i++){
setGraph(wires[i][0],wires[i][1],1);
}
for(int i=0;i<wires.size();i++){
//λ°©λ¬Έ λ°°μ΄ μ΄κΈ°ν
fill_n(visited,101,false);
//λμ μ μ 0μΌλ‘ λ§λ€μ΄μ£ΌκΈ° -> μ μ λκΈ°
setGraph(wires[i][0],wires[i][1],0);
vector<int> diff;
for(int i=1;i<=n;i++)
{
int tmp=dfs(i,n); //κΉμ΄ νμ
if(!tmp)continue; //λ°©λ¬Έν κ²½μ° μλ΅
diff.push_back(tmp);
}
answer = min(answer, abs(diff[0]-diff[1]));
if(answer==0)break;
//μμνλ‘ λλ €λκΈ°
setGraph(wires[i][0],wires[i][1],1);
}
return answer;
}
3. ν΄μ€
//dfs, visited λ°©λ²
int solution(int n, vector<vector<int>> wires) {
int answer = 101;
//μ°κ²°λμ΄ μλ λͺ¨λ μ‘μ ν 1λ‘ μ΄κΈ°ν
for(int i=0;i<wires.size();i++){
setGraph(wires[i][0],wires[i][1],1);
}
for(int i=0;i<wires.size();i++){
//λ°©λ¬Έ λ°°μ΄ μ΄κΈ°ν
fill_n(visited,101,false);
//λμ μ μ 0μΌλ‘ λ§λ€μ΄μ£ΌκΈ° -> μ μ λκΈ°
setGraph(wires[i][0],wires[i][1],0);
vector<int> diff;
for(int i=1;i<=n;i++)
{
int tmp=dfs(i,n); //κΉμ΄ νμ
if(!tmp)continue; //λ°©λ¬Έν κ²½μ° μλ΅
diff.push_back(tmp);
}
answer = min(answer, abs(diff[0]-diff[1]));
if(answer==0)break;
//μμνλ‘ λλ €λκΈ°
setGraph(wires[i][0],wires[i][1],1);
}
return answer;
}
dfsλ₯Ό μ΄μ©ν΄μ νμ΄μΌνλ λ¬Έμ μ΄λ€. μ²μμ λ¬Έμ λ₯Ό μ κ·Όν λ dpλ‘ μ κ·Όνμ¬μ λ
Έλμ νμ κ°―μλ₯Ό λμ νμμλλ° ν΄λΉ κ²½μ°λ λ
Έλκ° μ λ ¬λμ΄ μμ§ μμ λ μ ν©νμ§ μκΈ° λλ¬Έμ μ¬μ©ν μ μμλ€.
νΈλ μμλ λ€μκ³Ό κ°μ΅λλ€.
1. λ¨Όμ μ°κ²°λμ΄ μλ λͺ¨λ μ‘μ νλ€μ 2μ°¨μ λ°°μ΄μ 1λ‘ νμν΄μ€λλ€.
//μ°κ²°λμ΄ μλ λͺ¨λ μ‘μ ν 1λ‘ μ΄κΈ°ν
for(int i=0;i<wires.size();i++){
setGraph(wires[i][0],wires[i][1],1);
}
2. 0~nλ²μ§Έ μ‘μ νμ κ°κ° λλ for λ¬Έμ μ΄μ©νμ¬ nλ² λλ €μ€λλ€.
for(int i=0;i<wires.size();i++){
3. λ°©λ¬Έ λ°°μ΄μ μ΄κΈ°ν ν΄μ£Όκ³ , 2μ°¨μ λ°°μ΄μμ λμ μ‘μ νμ 0μΌλ‘ λ§λ€μ΄μ€λλ€.
//λ°©λ¬Έ λ°°μ΄ μ΄κΈ°ν
fill_n(visited,101,false);
//λμ μ μ 0μΌλ‘ λ§λ€μ΄μ£ΌκΈ° -> μ μ λκΈ°
setGraph(wires[i][0],wires[i][1],0);
4. dfs νμμ ν΅ν΄ λ°©λ¬Ένμ§ μκ³ μ°κ²°μ΄ λμ΄μ§μ§ μμ κ³³κΉμ§ νμμ νμ¬ νμ λ
Έλμ κ°―μλ₯Ό λ°ννκ³ κ·Έ κ°λ€μ μ°¨μ΄λ₯Ό λ°νν©λλ€.
vector<int> diff;
for(int i=1;i<=n;i++)
{
int tmp=dfs(i,n); //κΉμ΄ νμ
if(!tmp)continue; //λ°©λ¬Έν κ²½μ° μλ΅
diff.push_back(tmp);
}
answer = min(answer, abs(diff[0]-diff[1]));
if(answer==0)break;
//μμνλ‘ λλ €λκΈ°
setGraph(wires[i][0],wires[i][1],1);