- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
题意范例
* * 1 * 10801: Lift Hopping ★★★☆☆ 題組:Problem Set Archive with Online Judge 題號:10801: Lift Hopping 解題者:丘珮珊 解題日期:2015年5月14日 題意:一摩天大樓高度不超過100 層樓(編號0~99) ,內有n(1~5)台電梯。每台電梯上下一層樓的速度T(1~100秒/樓)都不同,且各電梯只停靠特定樓層。若要換搭另一台電梯,則兩電梯都要停在同一樓,並須等待60秒。求從0樓搭電梯到k樓所需的最時間(秒),不可能到達則輸出IMPOSSIBLE。 * 題意範例:2 30 2台電梯,目的k為30樓10 5 電梯1速度為10秒/樓,電梯2速度為5秒/樓0 1 3 13 15 20 99 電梯1停靠的樓層4 13 15 19 20 30 電梯2停靠的樓層=275 (130+60+85) 電梯1,0~13樓,13*10=130秒 換電梯2,60秒 電梯2,13~30樓,17*5=85秒3 50 3台電梯,目的k為50樓10 50 100 速度分別為10秒/樓、50秒/樓、 100秒/樓0 10 30 40 電梯1停靠的樓層0 20 30 電梯2停靠的樓層0 20 50 電梯3停靠的樓層=3920 (300+60+500+60+3000) 電梯1,0~30樓,30*10=300秒,換電梯等60秒 電梯2,30~20樓,10*50=500秒,換電梯等60秒 電梯3,20~50樓,30*100=3000 * 解法:先計算不換電梯時各層樓間移動所需的最短時間(計算權重),最後再計算換電梯時0樓到各樓所需的最短時間(尋找最短路徑)。1.不換電梯: (計算權重、找相鄰的點)二維陣列time[i][j]:i到j樓所需的最短時間,初始值為無限大。每當輸入電梯停靠的樓層時,更新time:有一電梯的速度為t秒/樓,以此電梯可停靠的各樓層i當作起始點,若到達其他可停靠樓層j的時間比time所存的短( | i-j |*t time[i][j] ),則更新time的值。 0 20 30 * 2.換電梯: (尋找最短路徑)(1)Dijkstra演算法: 一維陣列mint[i]:0到i樓所需的最短時間,初始值為不換電梯的最短時間(time[0][i])。 Queue Q:紀錄已是最小值的點,初始值為0樓。 找到mint[]的最小值mint[i],且i不在Q中,將i push入Q。 以i為中繼點重新計算mint:j=可停靠的樓層,若0到i樓+換電梯60秒+i到j樓,小於目前0到j樓的時間(mint[i]+60+time[i][j] mint[j]),則更新mint[j]。 步驟重複步驟(1)、(2)直到Q內含有所有可停靠的樓層(或Q含有k樓時結束)。 * (2)Bellman-Ford演算法: 一維陣列mint[i]:0到i樓所需的最短時間,初始值為不換電梯的最短時間(time[0][i])。 以i為中繼點重新計算mint:i、j=i可到達的點,窮舉所有(i,j),使mint[i]+60+time[i][j] mint[j],更新mint[j]。 重複步驟(1)V(# of vertex)-1次。 時間複雜度:O(VE) * (3)SPFA(Shortest Path Faster Algorithm)演算法: Bellman-Ford演算法優化,減少步驟(1)重複的次數。 一維陣列mint[i]:0到i樓所需的最短時間,初始值為不換電梯的最短時間(time[0][i])。queue Q:欲成為中繼點更新mint的樓層,初始值為0可到達的樓層(time[0][i]!=無限大)。 pop Q得i。 以i為中繼點重新計算mint:j=可停靠的樓層,若mint[i]+60+time[i][j] mint[j],更新mint[j]。 當mint[j]的值更改時,代表以j為中繼點可能出現更短的路徑,因此將j push入Q(若j在Q中則不用)。 重複步驟(1)~(3)直到Q內為空。 3.輸出:若mint[k]=無限大則輸出IMPOSSIBLE,否則mint[k]即為所求。 * 解法範例:3 50 3台電梯,目的k為50樓10 50 100 速度分別為10秒/樓、50秒/樓、 100秒/樓0 10 30 40 電梯1停靠的樓層0 20 30 電梯2停靠的樓層0 20 50 電梯3停靠的樓層1.不換電梯: (計算權重) | i-j |*t time[i][j] time 0 10 20 30 40 50 … 0
文档评论(0)