最長路徑為什麼是最短時間
1. 數據結構中關鍵路徑有說完成整個工程的最短時間為原點到匯點的最長帶權路徑,為什麼如題 謝謝了
int* ve=(int*)malloc(projectnumber*sizeof(int));//用來表示Vj最早發生時間 int* l=(int*)malloc(activenumber*sizeof(int));//用來表示活動Ai最遲完成開始時間 int* e=(int*)malloc(activenumber*sizeof(int));//表示活動最早開始時間 edgenode *p; totaltime=0; for(i=0;i<projectnumber;i++) ve[i]=0; for(i=0;i<projectnumber;i++) } while(front!=rear) } if(m<projectnumber) totaltime=ve[projectnumber-1]; for(i=0;i<projectnumber;i++) vl[i]=totaltime; for(i=projectnumber-2;i>=0;i--) } i=0; printf("| 起點 | 終點 | 最早開始時間 | 最遲完成時間 | 差值 | 備注 |\n"); for(j=0;j<projectnumber;j++) } return 1; } void seekkeyroot() int main() while(ch!='S'&&ch!='E'); switch(ch) } } 4: 總結: 至此,全部的設計過程完畢,上面所有代碼已經在VC6.0+Win2000平台下調試成功。從上面的分析可以看出 ,設計結果與預測的相符合. 關鍵路徑在具體的工程中有著重要的作用,當一個AOE網路中的關鍵路徑只有一條時,加速關鍵路徑上的任一關鍵活動,能夠加速整個工程的完成。但當一個AOE網路中的關鍵路徑不止一條時,加速任一關鍵活動不一定能夠加速整個工程的完成。 如方案1與方案2在改變關鍵路徑時整個工程的進度沒有改變。
2. 圖中的最長路徑問題怎麼算
把距離取負值就是個最短路徑問題,有負權值的最短路徑不適用dijkstra演算法,但基於鬆弛技術的bellmanford和floyd演算法都是適用的,計算多點之間最短路徑使用floyd演算法
具體來說是進行n-2輪鬆弛,即對任意兩點窮舉第三點,並嘗試將距離替換成經由第三點的距離。完成後額外進行一輪鬆弛,如果距離繼續變小,說明存在負權有向環,最短路徑不存在(可以不斷沿著環繞),否則當前路徑就是最短路徑。
3. 數據結構中,關鍵路徑是最長的路徑,那為什麼求的時候還要找最早路徑和最晚路徑相等的路徑呢
完成不同路徑上的活動所需時間雖然不同,但是只有所有路徑上的活動都完成了,整個工程才能算是結束了。因此,從源點到匯點的所有路徑中,具有最大路徑長度的路徑稱為關鍵路徑。把關鍵路徑上的活動稱為關鍵活動。完成整個工程的最短時間就是關鍵路徑的長度,也就是關鍵路徑上各種花費開銷的總和。這是因為關鍵活動影響了整個工程的時間,即如果關鍵活動不能按時完成的話,整個工程的完成時間就會延長。因此,只要找到了關鍵活動,就找到了關鍵路徑,也就可以得出最短完成時間。
4. AOE網中工程求最短時間為什麼選最長路徑作關鍵路徑,而不是最短路徑
最短路徑只是某一點到另一點走的最快最短的路徑,而關鍵路徑以點為事件,需要將所有工程完成時的路徑,所以選最長路徑為關鍵路徑才能確保所有工程都完成.
5. 關鍵路徑及最短時間
做一次飯需要1小時,燒一次水需要半小時;如果同時開始做飯和燒水,兩項工作全部做完,所需時間就是1小時;因為做飯需要的時間長。
做飯相當於關鍵路徑,做飯時間相當於關鍵路徑的長度,也就是兩項工作全部做完的最短時間
6. 《數據結構》關鍵路徑問題【高手進】
AOE網(Activity On Edge)即邊表示活動的網,是一個帶權的有向無環圖,其中頂點表示事件(Event),每個事件表示在它之前的活動已經完成,在它之後的活動可以開始,弧表示活動,權表示活動持續的時間。AOE網可用來估算工程的完成時間。由於整個工程只有一個開始點和一個完成點,故在正常的情況(無環)下,網中只有一個入度為零的點(源點)和一個出度為零的點(匯點)。
由於在AOE網中有些活動可以並行地進行,所以完成工程的最短時間是從開始點到完成點的最長路徑的長度(路徑上各活動持續時間之和)。路徑長度最長的路徑叫做關鍵路徑。假設開始點是v1,從v1到vi的最長路徑長度叫做事件vi的最早發生時間,這個時間決定了所有以vi為尾的弧所表示的活動的最早開始時間。用e(i)表示活動ai的最早開始時間,l(i)為一個活動的最遲開始時間,這是在不推遲整個工程完成的前提下,活動ai最遲必須開始進行的時間。兩者之差l(i)-e(i)意味著完成活動ai的時間餘量。l(i)=e(i)的活動叫做關鍵活動。關鍵路徑上的所有活動都是關鍵活動,提前完成非關鍵活動(不在關鍵路徑的活動)並不能加快工程的進度。為了求得AOE網中活動的e(i)和l(i),首先應求得事件的最早發生時間ve(j)和最遲發生時間vl(j)。如果活動ai由弧<j, k>表示,其持續時間記為t(<j, k>),則有:e(i) = ve(j), l(i) = vl(k) - t(<j, k>)。求ve(j)和vl(j)需分兩步進行:
從ve(0)=0開始向前遞推,其中T是所有以第j個頂點為頭的弧的集合。
從vl(n-1)=ve(n-1)起向後遞推,其中S是所有以第i個頂點為尾的弧的集合。
活動ai的最早開始時間e[i]
若活動ai是由弧<vi,vj>表示,根據AOE網的性質,只有事件vi發生了,活動ai才能開始。也就是說,活動ai的最早開始時間應等於事件vi的最早發生時間。因此,有:e[i]=ve[i]
活動ai的最晚開始時間l[i]
活動ai的最晚開始時間指,在不推遲整個工程完成日期的前提下,必須開始的最晚時間。若 由弧< vi,vj>>表示,則ai的最晚開始時間要保證事件vj的最遲發生時間不拖後。因此,應該有:l[i]=vl[j]-t(<vi,vj>)
由此得到求關鍵路徑的演算法:
輸入e條弧<j, k>,建立AOE網的存儲結構;
從源點出發,令ve[0]=0,按拓撲順序求其餘各頂點的最早發生時間ve[i](1<=i<=n-1)。如果得到的拓撲有序序列中頂點個數小於網中頂點數n,則說明網中存在環,不能求關鍵路徑,演算法終止,否則轉到步驟(3);
從匯點vn出發,令vl[n-1]=ve[n-1],按逆拓撲順序求其餘各頂點的最遲發生時間vl[i](n-2>=i>=0);
根據各頂點的ve和vl值,求每條弧s的最早開始時間e(s)和最遲開始時間l(s)。若某弧滿足條件e(s)=l(s),則為關鍵活動。
7. 可以用求最短路徑的方法思想求最長路徑么為什麼
floyed演算法可以有迴路,但是不能有負權迴路。
最長路問題分成兩種:
1. 可以走重復邊。
2. 不能走重復邊。
如果是1的話,那麼如果圖中有一條權為正的環,那麼你沿著環反復走就得到無限長的路了,而如果沒有這樣的環的話,Bellman–Ford(單源)或者Floyed(任意點對)演算法都可以計算出正確的解。
8. 光走更長的路反而時間更短,這究竟是為什麼呢
生活中我們為了更快地到達目的地,最好的辦法是沿著自己與目的地之間的直線連接行走,這樣的路程是最短的,因此花的時間也是最少的,這個道理我們都懂,但是我們從光的傳播中卻得到一個這樣的結果:路程最短,時間卻不一定最短。這不是與我們的現實生活相矛盾嗎?在揭示這種現象時,我們先了解下面的一些知識。