這幾天在找工作的過程中,碰巧看見華為軟體比賽的演算法題,看了下,挺感興趣的,寫下自己的一點思路。題目表述如下(包括輸入輸出格式、評分規則以及執行環境):
前言 賽題源自「未來網路」業務發放中的路由計算問題。算路問題屬於基礎演算法問題,在圖論、網路、交通等各個方面均有著廣泛的研究與運用,裡面不乏一些經典的演算法,例如最短路中的廣度優先搜尋,dijkstra演算法等。網路算路問題的更優演算法實現對於網路資源高效配置具有重要價值。
1 問題定義
給定乙個帶權重的有向圖g=(v,e),v為頂點集,e為有向邊集,每一條有向邊均有乙個權重。對於給定的頂點s、t,以及v的子集v』,尋找從s到t的不成環有向路徑p,使得p經過v』中所有的頂點(對經過v』中節點的順序不做要求)。
若不存在這樣的有向路徑p,則輸出無解,程式執行時間越短,則視為結果越優;若存在這樣的有向路徑p,則輸出所得到的路徑,路徑的權重越小,則視為結果越優,在輸出路徑權重一樣的前提下,程式執行時間越短,則視為結果越優。
說明:
1)圖中所有權重均為[1,20]內的整數;
2)任一有向邊的起點不等於終點;
3)連線頂點a至頂點b的有向邊可能超過一條,其權重可能一樣,也可能不一樣;
4)該有向圖的頂點不會超過600個,每個頂點出度(以該點為起點的有向邊的數量)不超過8;
5)v』中元素個數不超過50;
6)從s到t的不成環有向路徑p是指,p為由一系列有向邊組成的從s至t的有向連通路徑,且不允許重複經過任一節點;
7)路徑的權重是指所有組成該路徑的所有有向邊的權重之和。
2 輸入與輸出
輸入檔案格式
以兩個.csv 檔案(csv 是以逗號為分隔符的文字檔案)給出輸入資料,乙個為圖的資料(g),乙個為需要計算的路徑資訊(s,t,v』)。檔案每行以換行符(ascii』\n』即0x0a)為結尾。
1)圖的資料中,每一行包含如下的資訊:
linkid,sourceid,destinationid,cost
其中,linkid 為該有向邊的索引,sourceid 為該有向邊的起始頂點的索引,destinationid為該有向邊的終止頂點的索引,cost 為該有向邊的權重。頂點與有向邊的索引均從0 開始 編號(不一定連續,但用例保證索引不重複)。
2)路徑資訊中,只有一行如下資料:
sourceid,destinationid,includingset
其中,sourceid 為該路徑的起點,destinationid 為該路徑的終點,includingset 表示必須經過的頂點集合v』,其中不同的頂點索引之間用』|』分割。
輸出檔案格式
輸出檔案同樣為乙個.csv 檔案。
1)如果該測試用例存在滿足要求的有向路徑p,則按p 經過的有向邊順序,依次輸出有向邊的索引,索引之間用』|』分割;
2)如果該測試用例不存在滿足要求的有向路徑p,則輸出兩個字元na;
3)只允許輸出最多一條有向路徑。
3 單個用例的評分機制
有解用例的排名機制
按下面流程對參賽者結果進行排名:
step1: 對於提交的結果,進行合法性檢驗(詳見題目描述);
step2: 程式執行時間不得超過10s;
若不滿足上述的結果則本用例得分為0;
step3: 計算提交的路徑的權重,權重越小,排名越優;
step4: 在權重相同的結果裡,用程式執行時間進行排名,時間越短,排名越優。
無解用例的排名機制
按下列流程對參賽者結果進行排名:
step1: 對於提交的結果,驗證是否識別出該用例無解,若無法識別或者演算法執行時間超10s,則本用例得分為0;
step2: 用程式的執行時間進行排名,時間越短,排名越優。
單個用例的評分標準如下:
根據上面排名流程得到的排名,使用標準分計分(排名第一的提交者為100分)。
若所有人均未得到正確結果,則所有人均得分為0。
4 最終得分機制
平台會使用n個測試用例判題,該n個測試用例分為初級、中級、高階三個等級,參賽者對於每個測試用例都會得到乙個百分制分數,使用加權平均分(初級權重為0.2,中級權重為0.3,高階權重為0.5)作為該參賽者的最終得分。
特別說明:在比賽初期,平台只放出初級、中級的測試用例,故此時滿分為50分,在比賽後期,才會放出高階測試用例(具體發放時間會在**公告通知),此時滿分才為100分,請各位參賽者注意。
5 簡單用例說明
在如上圖所示的有向圖中,我們會得到下面的有向圖資訊:
0,0,1,1
1,0,2,2
2,0,3,1
3,2,1,3
4,3,1,1
5,2,3,1
6,3,2,1
如果此時需要尋找從0到1的路徑,且必須經過頂點2和3,我們會得到如下的路徑資訊:
0,1,2|3
對於該用例,可以找到如下兩條可行路徑:
1|5|4
2|6|3
由於第一條路徑的權重為4,第二條路徑的權重為5,所以此時最優解應該1|5|4。
———-分————-割————-線———————–
我的思路:
首先先弱化題目「使得p經過v』中所有節點」的約束條件,暫且不考慮它。
先標記 v』 中每個頂點。
1.先判斷對給定頂點s 、t,圖是否連通,也就是以s為起點dfs遍歷一遍。在遍歷過程中對屬於v』中的頂點計數(每個頂點記一次)
假如不連通,結束程式。
假如連通,那麼
從精益軟體到精益思想
說起精益軟體開發,這絕對算是乙個老生常談的話題了。所以在這裡,我不想去談論諸如 精益軟體開發的幾大原則 或是 精益軟體開發的最佳實踐 等陳詞濫調 只是最近在同事的推薦下,拜讀了一本有關it運維方面的書籍 鳳凰專案 書中的故事十分有趣,同時又引人深思,細細品味後頗有感悟,對工作和生活上有了許多新的想法...
精益思想與軟體過程
由於為企業做軟體諮詢的原因,我們經常把精益理念推介給我們的客戶,以期為客戶創造更大的價值。精益理念在製造業界備受推崇,並作為一種實用的管理技術為許多企業帶來了巨大的成功。20 世紀初,美國福特汽車公司創立了流水線生產。這種生產方式通過以標準化 大批量生產為標誌,來降低生產成本,提高生產效率。使汽車從...
精益軟體開發的思想 精益軟體開發原理快速指南
精益軟體開發的思想 我記得在早期的中學商業課上就曾在豐田公司學習精益生產,並且對通過有意設計來最大限度地減少浪費和提高生產率的想法深深著迷。隨著時間的流逝,精益方法被製造業以外的多個行業所採用,包括軟體開發。精益軟體開發將一些核心原則付諸實踐以優化生產力。軟體開發具有幾個關鍵功能,這使其成為應用精益...