codility上的问题(26) Hydrogenium 2013
題目,挺無聊的。一個(gè)裸的最短路。n個(gè)點(diǎn),你住在0,要去買東西,每個(gè)點(diǎn)有一個(gè)關(guān)門時(shí)間,問能最早買到食物的時(shí)間。有兩點(diǎn)注意 (1)有重邊 (2) 原圖是dicrect連接。。。但不是有向邊,被這個(gè)誤導(dǎo)了。direct當(dāng)直接講……原圖無向圖。后面就是裸的dijkstra算法。
數(shù)據(jù)范圍 點(diǎn) N [0..100] 不知道為啥還有0.。。。
? ? ? ? ? ? ? ? ?連邊 數(shù) M [1..10000]
連邊按3元祖給書 A 里面數(shù)據(jù)范圍 ?[0..99] B 里面數(shù)據(jù)范圍 [0..99]是節(jié)點(diǎn) C [0..10^5]表示從A到B的時(shí)間
還有一個(gè)長度為N的數(shù)組D,表示關(guān)門時(shí)間,數(shù)值范圍 [-1..10^9]表示關(guān)門時(shí)間,-1表示已經(jīng)關(guān)門了。
返回能買到食品的最早時(shí)間,買不到輸出-1。
要求復(fù)雜度 時(shí)間 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; }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3285861.html
總結(jié)
以上是生活随笔為你收集整理的codility上的问题(26) Hydrogenium 2013的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Builder技巧集锦
- 下一篇: 简单的 基于seajs一个base基础库