2020-1ν•™κΈ°, λŒ€ν•™μ—μ„œ β€˜μ•Œκ³ λ¦¬μ¦˜β€™ μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 지적은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€ :)

5 minute read

2020-1ν•™κΈ°, λŒ€ν•™μ—μ„œ β€˜μ•Œκ³ λ¦¬μ¦˜β€™ μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 지적은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€ :)


κ·Έλž˜ν”„ $G$μ—μ„œ <Independent Set; 독립집합>은 μ•„λž˜μ™€ 같이 μ •μ˜ν•œλ‹€.

Definition. Independent Set

Given a graph $G = (V, E)$, a subset $S \subset V$ is an <independent set> if there are no edges between nodes in the subset $S$.

<Independent Set Problem>은 κ·Έλž˜ν”„μ—μ„œ κ°€λŠ₯ν•œ 독립집합 쀑 κ°€μž₯ 큰 집합을 μ°ΎλŠ” 문제λ₯Ό λ§ν•œλ‹€. 일반적으둜 <Independent Set Problem>λ₯Ό polynomial time으둜 ν‘ΈλŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€. 이것에 λŒ€ν•΄μ„œλŠ” <NP-complete>에 λŒ€ν•΄ λ‹€λ£° λ•Œ λ‹€μ‹œ μ–ΈκΈ‰ν•˜λ„λ‘ ν•˜κ² λ‹€.

κ·ΈλŸ¬λ‚˜ λ§Œμ•½ κ·Έλž˜ν”„ $G$κ°€ tree라면, <Independent Set Problem>λ₯Ό linear time으둜 ν•΄κ²°ν•  수 μžˆλ‹€!!


λ¨Όμ € 첫 번째 κ²½μš°λŠ” 트리의 λ…Έλ“œμ— κ°€μ€‘μΉ˜κ°€ μ—†λŠ” κ²½μš°λ‹€. 문제λ₯Ό λ¬˜μ‚¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

당신은 νšŒμ‚¬ νŒŒν‹°λ₯Ό μ£Όμ΅œν•˜λ € ν•œλ‹€. μ΅œλŒ€ν•œ λ§Žμ€ μ‚¬λžŒμ„ μ΄ˆλŒ€ν•˜λ € ν•˜μ§€λ§Œ 각각의 μ‚¬λžŒλ“€μ€ λ°”λ‘œ 직속 상사가 νŒŒν‹°μ— 올 경우 νŒŒν‹°μ— μ˜€μ§€ μ•ŠλŠ”λ‹€.

이 경우, greedy ν•˜κ²Œ μ ‘κ·Όν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€!

while $T$ is not empty:
   take all the leaves to the solution.
   remove them and their parents from $T$.
return the constructed solution.


두 번째 κ²½μš°λŠ” 트리의 λ…Έλ“œμ— κ°€μ€‘μΉ˜κ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°λ‹€. 문제λ₯Ό λ¬˜μ‚¬ν•˜λ©΄,

μœ„μ˜ λ¬Έμ œμ™€ 상황은 λ˜‘κ°™μœΌλ‚˜ νŒŒν‹°μ— μ˜€λŠ” μ‚¬λžŒλ§ˆλ‹€ 맀λ ₯적인 정도가 μžˆμ–΄μ„œ 이 맀λ ₯λ„μ˜ εˆμ„ μ΅œλŒ€λ‘œ ν•˜κ³ μž ν•œλ‹€.

이 κ²½μš°λŠ” DPλ₯Ό 톡해 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€!!

λ…Έλ“œ $s$λ₯Ό root둜 ν•˜λŠ” sub-tree의 Maximum Weight Ind. Set은 μ•„λž˜μ™€ 같이 ꡬ할 수 μžˆλ‹€.

\[D(s) = \max \left\{ \sum_{\text{child $v$ of $s$}} D(v), \; w(s) + \sum_{\text{grandchild $u$ of $s$}} D(u) \right\}\]

κ΅¬ν˜„

벑쀀 2213번: 트리의 독립집합λ₯Ό κΈ°μ€€μœΌλ‘œ κ΅¬ν˜„ν•œ μ½”λ“œλ₯Ό 해섀해보겠닀.

λ¨Όμ € Maximum Weight Sum of Ind. Set $D(u)$의 값을 μ €μž₯ν•  DP 배열을 κ΅¬μƒν•œλ‹€.

int dp[VMAX][2]; // Maximum Weight Sum of Ind. Set

μ΄λ•Œ, dp[i][0]λŠ” $i$번째 λ…Έλ“œλ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ, dp[i][1]λŠ” $i$번째 λ…Έλ“œλ₯Ό ν¬ν•¨ν–ˆμ„ λ•Œμ˜ Maximum Weight Sum이닀.

문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ μž¬κ·€ν•¨μˆ˜λŠ” μ•„λž˜μ™€ κ°™λ‹€.

int root = 1; // μ–΄λŠ λ…Έλ“œλ₯Ό root둜 μ‚¬μš©ν•˜λ“  상관 X
travel(root, -1);

void travel(int node, int par) {
  dp[node][0] = 0;
  dp[node][1] = weight[node];
  IndSet[node][1].push_back(node);

  // visit children
  for (int i = 0; i < edges[node].size(); i++) {
    int child = edges[node][i];
    if (child == par) continue; // root node

    travel(child, node); // recursion

    // exclude root node -> use child or not -> use `dp[child][0]` or `dp[child][1]`
    bool whichBigger = dp[child][1] >= dp[child][0];
    dp[node][0] += dp[child][whichBigger];
    for (int j = 0; j < IndSet[child][whichBigger].size(); j++) {
      IndSet[node][0].push_back(IndSet[child][whichBigger][j]);
    }

    // include root node -> not use child -> use `dp[child][0]`
    dp[node][1] += dp[child][0];
    for (int j = 0; j < IndSet[child][0].size(); j++) {
      IndSet[node][1].push_back(IndSet[child][0][j]);
    }
  }
}

travel(int node, int par) ν•¨μˆ˜λŠ” dp[node][]의 값을 κ²°μ •ν•˜λŠ” ν•¨μˆ˜λ‘œ μžμ‹ λ…Έλ“œλ“€μ˜ dp 값을 μˆœνšŒν•œλ‹€. λ¬Έμ œμ—μ„œ 독립집합에 μ†ν•˜λŠ” μ›μ†Œμ˜ λͺ©λ‘μ„ μ œμ‹œν•˜λΌλŠ” 쑰건이 μžˆμ–΄ IndSet으둜 이λ₯Ό κΈ°λ‘ν•˜μ˜€λ‹€.

dp[node][]의 값을 κ°±μ‹ ν•  λ•ŒλŠ” 두 가지 κ²½μš°κ°€ μžˆλŠ”λ°,

1. nodeλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” 경우; dp[node][0]

이 경우 dp[child][0]κ³Ό dp[child][1] 쀑 더 큰 값을 μ„ νƒν•˜λ©΄ λœλ‹€. 처음 μ½”λ“œλ₯Ό 지 λ•ŒλŠ” dp[child][1]λ₯Ό μ„ νƒν•˜λ„λ‘ ν–ˆλŠ”λ°, 이것은 child λ…Έλ“œλ₯Ό λ°˜λ“œμ‹œ μ„ νƒν•˜κ²Œ ν•œλ‹€. κ·ΈλŸ¬λ‚˜ child μ„ νƒν•˜λŠ” 것이 가쀑합을 μ΅œλŒ€λ‘œ ν•œλ‹€λŠ” 보μž₯이 μ—†κΈ° λ•Œλ¬Έμ— dp[child][0]κ³Ό dp[child][1]의 값을 λΉ„κ΅ν•˜μ—¬ 더 큰 값을 μ„ νƒν•΄μ€˜μ•Ό ν•œλ‹€!

2. nodeλ₯Ό ν¬ν•¨ν•˜λŠ” 경우; dp[node][1]

이 κ²½μš°λŠ” κ°„λ‹¨ν•˜κ²Œ dp[child][0]의 값을 더해주면 λœλ‹€. πŸ˜‰

μœ„μ™€ 같이 μ½”λ“œλ₯Ό 짜면 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

(참고둜 본인은 λ§ˆμ§€λ§‰μ— sorting 쑰건을 μžŠμ–΄μ„œ λͺ‡λ²ˆμ„ μ‹€νŒ¨ν–ˆμ—ˆλ‹€β€¦ 🀯)


β€œνŠΈλ¦¬μ˜ 독립집합” 문제의 경우 포슀트λ₯Ό μž‘μ„±ν•˜λ©΄μ„œ λ‹€μ‹œ ν’€μ–΄λ³΄μ•˜λŠ”λ°, ν™•μ‹€νžˆ μ €λ²ˆμ— λΉ„ν•΄ μ½”λ”© μŠ€νƒ€μΌμ΄ 많이 λ‹€λ“¬μ–΄μ‘Œλ‹€. πŸ‘


μΆ”μ²œλ¬Έμ œ


references

Categories:

Updated: