codility上的问题(26) Hydrogenium 2013
生活随笔
收集整理的這篇文章主要介紹了
codility上的问题(26) Hydrogenium 2013
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目,挺無聊的。一個裸的最短路。n個點,你住在0,要去買東西,每個點有一個關門時間,問能最早買到食物的時間。有兩點注意 (1)有重邊 (2) 原圖是dicrect連接。。。但不是有向邊,被這個誤導了。direct當直接講……原圖無向圖。后面就是裸的dijkstra算法。
數據范圍 點 N [0..100] 不知道為啥還有0.。。。
? ? ? ? ? ? ? ? ?連邊 數 M [1..10000]
連邊按3元祖給書 A 里面數據范圍 ?[0..99] B 里面數據范圍 [0..99]是節點 C [0..10^5]表示從A到B的時間
還有一個長度為N的數組D,表示關門時間,數值范圍 [-1..10^9]表示關門時間,-1表示已經關門了。
返回能買到食品的最早時間,買不到輸出-1。
要求復雜度 時間 O(N^2) 空間 O(N^2)。
?
// you can also use includes, for example: // #include <algorithm>int solution(const vector<int> &A, const vector<int> &B, const vector<int> &C, const vector<int> &D) {// write your code here...int n = D.size(),i,ind,m = A.size();if ((n == 0) || (D[0] >= 0)) {return 0;}vector<vector<int> > e;e.resize(n);for (i = 0; i < n; ++i) {e[i].resize(n, -1);}for (i = 0; i < m; ++i) {if ((e[A[i]][B[i]] < 0) || (e[A[i]][B[i]] > C[i])) {e[A[i]][B[i]] = e[B[i]][A[i]] = C[i];}}vector<bool> mark;mark.resize(n, false);vector<int> d;d.resize(n, -1);d[0] = 0;for (;;) {ind = -1;for (i = 0; i < n; ++i) {if ((!mark[i]) && (d[i] >= 0) && ((ind < 0) || (d[ind] > d[i]))) {ind = i;}}if (ind < 0) {break;}if (d[ind] <= D[ind]) {return d[ind];} mark[ind] = true;for (i = 0; i < n; ++i) {if ((!mark[i]) && (e[ind][i] >= 0) && ((d[i] < 0) || (d[i] > d[ind] + e[ind][i]))) {d[i] = d[ind] + e[ind][i];}}}return -1; }?
?
轉載于:https://www.cnblogs.com/pangblog/p/3285861.html
總結
以上是生活随笔為你收集整理的codility上的问题(26) Hydrogenium 2013的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Builder技巧集锦
- 下一篇: C# 串口编程 — MVVM MVVM