期末關鍵路徑大作業

2021-10-08 12:45:35 字數 4071 閱讀 6102

回顧幾個問題

完成一部電影需要很多環節,具體環節如下:

a) 專案啟動到確定導演需要 1 個時間,已確定導演到完善細節需要 2 個時間,已經完善細

節到開始拍攝需要 2 個時間。

b) 專案啟動到確定演員需要 3 個時間,已確定導演到已確定演員需要 1 個時間,已確定演

員到開始拍攝需要 2 個時間。

c) 專案啟動到完成場地確認需要 5 個時間,完成演員確定到完成場地確認需要 1 個時間,

完成場地確認到完善細節需要 1 個時間,完成場地確認到開始拍攝需要 2 個時間。

請選擇合適的結構,設計演算法,計算出從專案啟動到開始拍攝之間至少需要多少個時間?

要求:請畫出完成一部電影的 aoe 圖,找出關鍵路徑,計算出從專案啟動到開始拍攝之間至

少需要多少個時間。

請將你的思路用**來實現,並輸出關鍵路徑,以及計算出從專案啟動到開始拍攝之間

至少需要多少個時間。(需要**和執行結果的截圖)

請分析演算法的效率,至少包括時間複雜度和空間複雜度等

#include#include#include#define mvnum 10 //最大頂點數,實際只有6個。 

int indegree[mvnum];//統計入度個數的陣列。

int stack1[mvnum];//臨時棧

int stack2[mvnum];//裝topo序列

int queue[mvnum*2];//裝最終的關鍵路徑下標與權值

int lowestsumtime=0;//最終最短路徑的和

int top1=-1,top2=-1,rear=0,front=0;//和棧與佇列相關的資訊

typedef int vertextype; //頂點型別

/*邊結點 */

typedef struct arcnode//邊結點

arcnode;

/*頂點結點*/

typedef struct vnode

vnode, adjlist[mvnum];

/*圖的資訊結構體*/

typedef struct inf

graph;

/*建立有向圖*/

int createdn(graph *g)

; arcnode *p,*p2;

/*輸入頂點個數 和邊的個數*/

printf("請輸入頂點總個數 和 弧的總條數:\n");

scanf("%d%d",&g->vexnum,&g->arcnum);

/*給每乙個頂點錄入資訊,包括下標,和名字字串*/

printf("請依次輸入頂點(0...n-1)下標和已完成的活動名稱(字串)【中間必須只用乙個空格隔開】 :\n");

for(i=0;ivexnum;i++)

printf("請連續依次輸入兩個頂點v1,v2與兩頂點間的權值(三者以空格分開,其中v1—>v2)。\n");

for(j=0;jarcnum;j++)

} /*獲取拓撲序列,並把topo序列存入棧stack2,並獲取最早事件發生陣列etv*/

void gettopostack2(graph g)

/*這裡用到了貪心思想。etv[cur]:向量(起點下標0,終點下標cur),事件0發生 到 事件cur發生 所需的最早發生時間。

下面if語句理解:(起點下標0,終點下標cur)+(起點下標cur,終點p->adjvex) > (起點下標0,終點p->adjvex) */

if(etv[cur]+p->weight > etv[p->adjvex])

p=p->nextarc;

} }}

/*獲取關鍵路徑*/

void getcriticalpath(graph g)

/*獲取ltv陣列*/

while(top2!=-1)//棧stack2不為空

p=p->nextarc;

} }/*把 事件1、關鍵活動的權值、事件2 裝入到佇列裡面,方便以後列印直觀 */

for(i=0;iadjvex]-p->weight;//公式二:活動(邊)最遲發生時間 = 事件2(頂點)最遲發生時間 - 權重(事件1-->事件2)

/*利用這個條件,可以把 事件1、關鍵活動的權值、事件2都找到*/

if(ete==lte)

p=p->nextarc;

} }

}int main()

indegree[i]=cnt;

} //獲得拓撲序列

gettopostack2(g);

//獲得關鍵路徑

getcriticalpath(g);

/*把結果列印出來(可以不用)*/

printf("關鍵路徑為:");

xb1=queue[front++];

timecost=queue[front++];

xb2=queue[front++];

printf("%s--%d-->%s",g.vertices[xb1].name,timecost,g.vertices[xb2].name);

for(i=0;front%s",timecost,g.vertices[xb2].name);

} printf("\n從專案啟動到開始拍攝之間至少需要時間數為:%d\n",lowestsumtime) ;

return 0;

}/*測試資料入下*/

/* 6 10

0 專案啟動

1 完成導演確認

2 完成完善細節

3 開始拍攝

4 完成確定演員

5 完成場地確認

注意:此程式編譯環境是devc++。

該程式最花費時間的三個步驟是 1.求拓撲序列 2.求 件最晚發生時間ltv 陣列3.將關鍵路徑裝入佇列queue。因為只有他們都用到了雙層迴圈巢狀結構,其他的最多就是單層迴圈。如圖:

分析一下,假如乙個aoe網有n個頂點,e條弧。那麼上面的三個步驟都是外層迴圈把每個頂點都遍歷一遍,時間複雜度是o(n),內層迴圈把每一條弧都遍歷了一遍,時間複雜度是o(e)。所以整個程式時間複雜度應該是o(n+e)。

呃,我不確定。教材上提到過,如果用鄰接表和逆鄰接表儲存aoe網的頂點和弧,假設乙個aoe網有n個頂點和e條弧,那麼空間複雜度為o(n+e)。但是我感覺這些儲存空間不可避免,多餘的空間才算(就像簡單排序演算法的空間複雜度是o(1),但是還是需要o(n)的空間存放元素。)。這個程式用到了stack1作為臨時棧存放資料元素,所以時間複雜度是o(n)。

1.獲得ete的公式是什麼?獲得lte的公式是什麼?

2.etv與ltv是怎麼得到的?

3.兩個if語句的理解?

if(etv[cur]+p->weight > etv[p->adjvex])

與if(ltv[gettop] > ltv[p->adjvex] - p->weight)

4. 邊結點中adjvex裝的是什麼? 弧頭一方的頂點下標。

5. 為什麼頂點結點的data用來裝的是下標值?因為頭插法需要定位頂點,這樣就避免了自己寫locatevex函式定位頂點了。

6.可以用逆鄰接表來實現其他功能嗎?我使用逆鄰接表主要是為了獲取每個頂點的入度大小。

期末大作業 25組

隨著現代多 技術的飛速發展,攝像不僅僅侷限於專業相機,而相片也就自然而然地成為了記錄生活美好瞬間的重要方式。雖然生活中不乏發現美的眼睛,但是如果能夠記錄並分享美的話,不僅能夠讓自己感到愉悅,還能夠給他人帶來快樂。所以這次期末大作業我們三人團隊計畫開發乙個家庭相簿系統,家庭成員可以通過共享賬號的方式上...

大資料應用期末大作業

這個作業的要求來自 1.資料匯入。因為我是用自己的資料進行分析,不免就要進行csv匯出,其中用到了pandas,具體 加入到爬蟲資料中即可。這是我自己的excel資料 將檔案另存為txt格式,並為bigdatacase授權。最後查詢資料,同時對以前的資料進行對比。具體的學習可以去處理文字檔案的語言。...

大一期末大作業

這個是我大一時候老師布置的期末大作業,功能很繁雜,差不多就是綜合了乙個學期的知識。我把 放上去大家自己看吧,如果有哪個功能不對的,可以去看我其他的練習,差不多都有,或者直接聊我也行。include include define pi 3.14 using namespace std int qumo...