回顧幾個問題
完成一部電影需要很多環節,具體環節如下:
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...