# **演算法作業 HW9**
<font size=5>**1. 最短路徑**</font>
---
* 請使用Branch-and-Bound找出下圖中,S到T的最短路徑。請畫出Branch-and-Bound圖,並標示各點的cost,以及被bound住的地方。(可參考ppt20頁)

Ans:

<font size=5>**2. Personnel Assignment Problem**</font>
---
* 已知5個工作(j1,…,j5),其先後關係為:j1 :arrow_right: j3 , j3 :arrow_right: j4 , j2 :arrow_right: j5,分配給5個人員(p1,…,p5)
* 其cost matrix如下:

* 例如:p1作j1到j5的工資分別為17,13,4,23,12
* 每人分配一個工作,且當ja < jb ,須要 pa < pb。
* 請使用Branch-and-Bound找出最少費用的人員工作分配。
Ans:

<font size=5>**3. Traveling Salesperson Optimization Problem**</font>
---
* 在ppt34頁中,該例首先以4-6將所有feasible solution分為兩集合。
* 現在,將原例的4-6改以6-7來作區分,接著再以3-5作區分,如下圖所示:

* 請計算出圖中每個紅框的lower bound,並列出reduced matrix。
Ans:

<font size=6>**Depth-First Search**</font>
---
<font size=5>**4. 左右反轉二元樹**</font>
---
[Invert Binary Tree - LeetCode](https://leetcode.com/problems/invert-binary-tree/)
往下探訪互換左右子節點就好了,沒什麼大問題。
完全靠自己,完成時間:一分鐘。
```c++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root)
return nullptr;
//往下探訪不斷置換左右子節點
invertTree(root->left);
invertTree(root->right);
swap(root->left,root->right);
return root;
}
};
```

<font size=5>**5. 找出第k小節點**</font>
---
[Kth Smallest Element in a BST - LeetCode](https://leetcode.com/problems/kth-smallest-element-in-a-bst/)
用中序去探訪二元搜尋樹,在中序裡第k個的數就是答案。
完全靠自己,完成時間:一分鐘。
```c++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int knum;
int kthSmallest(TreeNode* root, int k) {
//按照中序去尋訪,第k個點就是第k小的
helper(root,0,k);
return knum;
}
int helper(TreeNode* root,int k,int tk)
{
if(!root)
return k;
//這裡的k為節點在中序的順序
k=helper(root->left,k,tk)+1;
if(k==tk)
knum=root->val;
return helper(root->right,k,tk);
}
};
```

<font size=5>**6. 本周心得**</font>
---
這周的觀念題要畫圖比較麻煩,但實作題很簡單。
---
若有錯誤歡迎指正