101北一女中 資訊選手培訓營 深度優先搜尋(DFS)的進階應用 2012.07.15 Nan.

Slides:



Advertisements
Similar presentations
陳旺全醫師主講 健康養生茶飲 明目菊花茶 明目菊花茶 成分:菊花五錢、 500c.c 熱水沖泡 成分:菊花五錢、 500c.c 熱水沖泡 功效:可治療急慢性結膜炎、頭暈 功效:可治療急慢性結膜炎、頭暈 頭痛、口苦、口乾、高血壓 頭痛、口苦、口乾、高血壓.
Advertisements

六大類食物 五穀根莖類 六大類食物 油脂類 蛋魚肉豆類 奶類 蔬菜類 水果類. 五穀根莖類 : 提供熱量 : 部份蛋白質,維生素,礦物質,及膳食纖維 包含麵 ( 及麵包饅頭 ) ,飯類,蕃薯等食物 也就是一般所稱的 " 主食 " ( 蘿蔔不是這一類,是屬於蔬菜類喔! ) 飲食建議吃三到六碗 並推薦攝取全穀類食品.
正確睡午睡精神更好 正確睡午睡 精神更好 可降血壓 增加思考能力 懶懶的冬天加 上星期一又是假日後上班,如果能夠在 中午補個眠,稍微休息一下,對於精神 的提振及下午工作效率都有幫助。但冬 天睡午覺要注意保暖以及水分的補充, 避免受涼或是血液循環不好,造成手或 腿麻痛,注意這些小地方可以讓睡午睡 更健康!
揮別電腦族疲勞症候群 主講人 : 陳潮宗 中醫師. 常有症狀一 起因&症狀: 起因&症狀: 坐姿不正最易引起腰酸背痛、 過度看螢幕則眼睛疲勞酸痛。 治療重點: 治療重點:補固腰腎、明目保睛。
引言 高血壓自我健康管理包含飲食、 運動、 及健康生活型態三大方向。 飲食 是改善高血壓的重要部分, 並提 供飲食方式來改善高血壓。
人事室專題計畫業務報告 人事室 謝明峯 轉 一、專任助理注意事項 計畫案如有聘任專任助理者, 請依據「南 華大學專案助理報到程序單」內容, 將資 料繳交至人事室 ( 請於聘任到職日前繳交, 以免影響到本身權利 ) 。 離職儲金或勞工退休金 依勞工退休金條例相關規定,
山伯與英台在健康書院修業完 成後,一行人逗陣開開心心的 回自己的家鄉 …… 於是開啟了另一段 ~ 新梁祝的故事 ~ 在下 梁山伯 小女子 祝英台 我是 阿成 我是 阿香.
糖尿病的饮食控制 厦门长庚医院张翼翔. 糖尿病 糖尿病的发病率逐年增高 糖尿病的发病率逐年增高 糖尿病对健康和生命的危害 糖尿病对健康和生命的危害 心、脑、肾、神经等 心、脑、肾、神经等 糖尿病的表现和诊断 糖尿病的表现和诊断 糖尿病的治疗 — 终身治疗 糖尿病的治疗 — 终身治疗.
第八章 膳食與營養 第一節 均衡營養與膳食 年 7 月公布新版「每日飲食指南」, 依食物營養特性,分為六大類: 全榖根莖類 蔬菜類水果類 低脂乳品類 油脂與堅果種子類 豆魚肉蛋類 食全十美.
中醫臨床常見養生藥膳 臺 北 市 立 聯 合 醫 院中醫院區 院長 鄭振鴻. 壹、前言 在臺灣地處亞熱帶的氣候,冬季溫暖,夏 季炎熱,雨量多的特性。吃補的概念源自 中國大陸,但生活習性與食物亦有其地域 性,因此針對臺灣常用藥膳的食物與藥物 的性能作用,解析其效用、功能,了解食 物與人的關係,利用食物特性,藥物的效.
青春期 女生可以早在八、九歲, 或晚到十三、四歲才進入 青春期。 男生早的在十、十一歲, 晚到十四、五歲,甚至更 遲才進入青春期。
高職生的早餐飲食習慣之研究 以市立士林高商為例 二年九班 李婷葦 二年九班 卓佳惠 二年九班 郭胤彣 關鍵字:早餐. 飲食習慣. 士林高商.
第八課 路 *課前預習 一 二 三 *題解 *作者介紹 *課文內容 一 、 、 、 *修辭回顧
請愛惜自己 衛生署日前公佈了去年國人的十大 死因統計,惡性腫瘤(癌症)又第 二十度蟬聯冠軍,而且是每四名死 亡人口中,就有一人「因癌而」,
E時代盛宴 健康123年菜發表會 新春新氣象,處於資訊蓬勃E時代的您,是否已構思好如何為自己及家人準備一桌健康、豐盛的年菜?隨著國人健康意識的提升,對年菜訴求也有別於傳統年菜四大特點-高油、高鹽、高糖、低纖,加上其繁瑣的製備過程,對講求速度及效率的E時代族群而言,已不符現今年菜簡單製備、健康需求性。在這距離農曆春節只剩短短二個星期,豐原醫院營養室關心您的健康、滿足您的胃蕾,推出「E時代盛宴-健康123-年菜發表會」,以「一高、二少、三低」的健康原則,利用家中減少烹調油量的鍋具,如:烤箱、電鍋、不沾鍋等,製
生活常規.
雅樂舞基本動作與身體探索 陳玉秀老師主授 【本著作除另有註明外,採取創用CC「姓名標示-非商業性-相同方式分享」台灣3.0版授權釋出】
嘴破怎麼辦? 嘴角或嘴唇內常常破一小傷口的人, 吃東西時真是痛苦萬分; 有的人試著補充維他命C及B群,
肺臟的藥膳介紹 台中慈濟醫院 中醫部 陳建仲.
位置的表示方法.
說明完後將會有一個小測驗歐! 要認真聽歐!
合理水價之探討 台灣省自來水公司前財務處經理 王禮忠 台灣省自來水公司財務處組長 賴祐.
口腔衛生保健 主講者:興中國小 護理師:莊靜華.
花孃心語.
校园信息管理系统 河北科技大学网络中心 2000/4/10.
水 生命之源 威海文登中心医院 王倩倩.
認識大腸直腸癌 大腸直腸外科 李元魁醫師.
芳香小物.
健康飲食觀 主講人:蘇麗棗.
兔 子.
請愛惜自己 衛生署日前公佈了去年國人的十大 死因統計,惡性腫瘤(癌症)又第 二十度蟬聯冠軍,而且是每四名死 亡人口中,就有一人「因癌而」,
節能減碳—兒童廢物利用 遊戲闖關活動 設計者—賴姿良 陳俐諭 陳松吉.
牙齒保健常識 胖福2050/12.
第1课 欧洲的君主专制 香山中学 聂渭清.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
農委會及其他計畫 執行應注意事項 第四組 涂怡禎 日期:104年10月5、6日.
膀胱過動症 & 間質性膀胱炎 台中榮總/埔里分院 蔡青倍.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
嘴破怎麼辦? 嘴角或嘴唇內常常破一小傷口的人, 吃東西時真是痛苦萬分; 有的人試著補充維他命C及B群, 有的人塗抹進口藥膏,
小組成員:洪偉凱 簡子昀 李佳旻 陳泓憲.
延伸課程(專題研習)科美好生活之成長的我
微笑的天空 2008.12.1(星期一)農曆戌子年十一月四日的傍晚天上的金星、木星在上弦月左右相互輝映,形成「微笑的天空 」天文奇景。 「金星、木星伴月」,在空軍官校停機坪的上空微笑著面對著校園裡所有仰望天空的筧橋學子,真是令人難忘!因此,決定將網路詩集的初刊定名為「微笑的天空 」。
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
Chapter 12 圖形結構 12.1 圖形的一些專有名詞 12.2 圖形資料結構表示法 12.3 圖形追蹤 12.4 擴展樹
別忘了,每天都要…… 實踐8大自然養生法 保持3次排便 至少喝3杯蔬果汁 曬太陽30分鐘
泰式料理食譜 137實餐 謝宏德.
第7章 图论基础与应用 PART A 《可视化计算》.
Chap5 Graph.
第8章 圖形結構(Graphs) 8-1 圖形的基本觀念 8-2 圖形的表示法 8-3 圖形的走訪 8-4 擴張樹
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
Graph 2 Michael Tsai 2012/5/1 連載: 學生上課睡覺姿勢大全
101北一女中 資訊選手培訓營 圖論基礎 Nan.
資料結構 第7章 圖形結構.
第四章 C 语言中的输入和输出.
深度優先搜尋(DFS)與 廣度優先搜尋(BFS)
Ch07 圖形與網路 淡江大學 周清江
最大網路流 Max (Network) Flow
微信商城系统操作说明 色卡会智能门店.
103資訊學科培訓 圖論 - BFS & DFS & 應用 講者:林庭宇.
北一女中 資訊選手培訓營 圖論基礎 By Nan( ).
鄧姚文 資料結構 第八章:圖(Graph) 鄧姚文
第四章 C 语言中的输入和输出.
12797: Letters ★★★☆☆ 題組:Problem Set Archive with Online Judge
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
Elementary Graph Algorithms
网校温州中学 关于显性基因与隐性基因 ——
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
Advanced Competitive Programming
圖形結構 Graph Structure chapter 9 德明科技大學資訊科技系.
最大網路流 Max (Network) Flow
Presentation transcript:

101北一女中 資訊選手培訓營 深度優先搜尋(DFS)的進階應用 2012.07.15 Nan

拓樸排序 Topological sort

“比我深的所有點(我的子孫)都一定在我的後面” (不是唯一解) 最前 最後 要有這個順序,這張圖必須是個DAG。

有向無環圖DAG Directed Acyclic Graph

那我們要怎麼用DFS 來做拓樸排序呢?

回顧一下…… D: 深度 1 3 2 4 6 5 D = 0 1 堆疊 Stack

回顧一下…… D: 深度 1 3 2 4 6 5 D = 0 D = 1 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 0 D = 1 4 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 0 D = 1 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 0 D = 1 6 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 3 6 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 6 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 D = 3 5 6 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 D = 3 6 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 D = 3 D = 2 D = 2 2 1

回顧一下…… D: 深度 1 3 2 4 6 5 D = 3 D = 0 D = 1 D = 3 D = 2 D = 2 1

回顧一下…… D: 深度 走訪順序:1 2 4 6 3 5 1 3 D = 3 D = 0 5 2 D = 1 D = 3 6 D = 2

換成有向圖 D: 深度 1 3 2 4 6 5 D = 0

換成有向圖 D: 深度 1 3 2 4 6 5 D = 0 D = 1

換成有向圖 D: 深度 1 3 D = 0 5 2 D = 1 6 4 D = 2 4不會在往下走了,之後只有可能存在走的到它的點  4可以當拓樸排序的最後的點

換成有向圖 D: 深度 1 3 2 4 6 5 D = 0 D = 1 D = 2 D = 2

換成有向圖 D: 深度 3不會在往下走了,之後只有可能存在走的到它的點 D = 3  3可以當拓樸排序的倒數 第二個點 1 3 D = 0  3可以當拓樸排序的倒數 第二個點 D = 3 D: 深度 1 3 2 4 6 5 D = 0 D = 1 D = 2 D = 2

換成有向圖 D: 深度 5不會在往下走了,之後只有可能存在走的到它的點 D = 3  5可以當拓樸排序的倒數 第三個點 1 3 D = 0  5可以當拓樸排序的倒數 第三個點 D = 3 D: 深度 1 3 2 4 6 5 D = 0 D = 1 D = 3 D = 2 D = 2

換成有向圖 D: 深度 D = 3 1 3 D = 0 5 2 D = 1 D = 3 6 D = 2 4 D = 2 6的小孩都走完了~  6可以當拓樸排序的倒數 第四個點

換成有向圖 D: 深度 D = 3 1 3 D = 0 5 2 D = 1 D = 3 2的小孩都走完了~ 4 6 5 D = 0 D = 1 D = 3 2的小孩都走完了~  2可以當拓樸排序的倒數 第五個點 D = 2 D = 2

換成有向圖 D: 深度 D = 3 1 3 D = 0 1的小孩都走完了~  1可以當拓樸排序的倒數 第六個點 5 2 D = 1 4 6 5 D = 0 1的小孩都走完了~  1可以當拓樸排序的倒數 第六個點 D = 1 D = 3 D = 2 D = 2

換成有向圖 D: 深度 剛剛的順序: 4 3 5 6 2 1 倒過來就是拓樸排序: 1 2 6 5 3 4 D = 3 1 3 D = 0

我們不會知道最前的點在哪 不過可以透過這樣的方式 讓整個順序還是對的 int N = # node; int map[N+1][N+1] = {{…},{…},…}; int visited[N+1] = {0}; int topo[N+1]; int topoN = 0; void dfs(int id){ int i; for ( i = 1 ; i <= N ; i++ ){ if ( map[id][i] == 1 && visited[i] == 0 ) { visited[i] = 1; dfs(i); } topo[topoN++] = id; int main(){ if ( visited[i] == 1 ) continue; for ( i = topoN - 1 ; i >= 0 ; i-- ) printf(“%d ”, topo[i]); putchar(10); 我們不會知道最前的點在哪 不過可以透過這樣的方式 讓整個順序還是對的

Strongly Connected Component, SCC

先從什麼是connected component(CC)開始… 無向邊 在同一個CC上的任兩點一定有路徑相通 可以用DFS來找(想想看為什麼?)

SCC 從無向邊變成有向邊 不能單純只用DFS (想想看為什麼?)

Kosaraju's Algorithm 先算出拓樸排序 把原圖的邊反向 從拓樸排序最前面的點開始做DFS,每做一次可走到的點就是在同一個SCC上

int N = # node; int map[N+1][N+1] = {{…},{…},…}; int visited[N+1] = {0}; int topo[N+1]; int topoN = 0; int sccID[N+1]; void dfs(int id){ int i; for ( i = 1 ; i <= N ; i++ ){ if ( map[id][i] == 1 && visited[i] == 0 ) { visited[i] = 1; dfs(i); } topo[topoN++] = id; void kosaraju(int id, int scc_id){ sccID[id] = scc_id; if ( map[i][id] == 1 && visited[i] == 0 ) {

int main(){ int i, sccN = 0; for ( i = 1 ; i <= N ; i++ ){ if ( visited[i] == 1 ) continue; visited[i] = 1; dfs(i); } visited[i] = 0; for ( i = topoN - 1 ; i >= 0 ; i-- ){ kosaraju(i, sccN++); printf(“The number of SCCs is %d\n”, sccN); 亦可參考DJWS的演算法筆記: http://www.csie.ntnu.edu.tw/~u91029/Connectivity.html#a4