# **演算法作業 HW9** <font size=5>**1. 最短路徑**</font> --- * 請使用Branch-and-Bound找出下圖中,S到T的最短路徑。請畫出Branch-and-Bound圖,並標示各點的cost,以及被bound住的地方。(可參考ppt20頁) ![](https://hackmd.io/_uploads/rJMG9wTE3.png) Ans: ![](https://hackmd.io/_uploads/ByqGp-RN2.png) <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如下: ![](https://hackmd.io/_uploads/r1CqlOp4h.png) * 例如:p1作j1到j5的工資分別為17,13,4,23,12 * 每人分配一個工作,且當ja < jb ,須要 pa < pb。 * 請使用Branch-and-Bound找出最少費用的人員工作分配。 Ans: ![](https://hackmd.io/_uploads/B1hD6ZAE3.png) <font size=5>**3. Traveling Salesperson Optimization Problem**</font> --- * 在ppt34頁中,該例首先以4-6將所有feasible solution分為兩集合。 * 現在,將原例的4-6改以6-7來作區分,接著再以3-5作區分,如下圖所示: ![](https://hackmd.io/_uploads/Bk4gou6Vh.png) * 請計算出圖中每個紅框的lower bound,並列出reduced matrix。 Ans: ![](https://hackmd.io/_uploads/S1sHJgrw3.png) <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; } }; ``` ![](https://hackmd.io/_uploads/S1BVkG04n.png) <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); } }; ``` ![](https://hackmd.io/_uploads/BJAMZmCEn.png) <font size=5>**6. 本周心得**</font> --- 這周的觀念題要畫圖比較麻煩,但實作題很簡單。 --- 若有錯誤歡迎指正