数据结构---关键路径
生活随笔
收集整理的這篇文章主要介紹了
数据结构---关键路径
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)結(jié)構(gòu)—關(guān)鍵路徑
原理:參考趣學(xué)數(shù)據(jù)結(jié)構(gòu)
代碼:
#include<stdio.h> #include<stdlib.h> #include "stack.h" #define typeNode int //每個(gè)頭結(jié)點(diǎn)的標(biāo)識數(shù)據(jù)類型 #define N 100 //最大結(jié)點(diǎn)數(shù) int degree[N];//結(jié)點(diǎn)入度數(shù),通過逆鄰接表來計(jì)算 int result[N];//拓?fù)湫蛄?/span> int ve[N];//結(jié)點(diǎn)(事件)的最早發(fā)生時(shí)間 int vl[N]; //結(jié)點(diǎn)(事件)的最晚發(fā)生時(shí)間 int ZNodeMatrix[N][N];//鄰接矩陣,一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)的權(quán)重 typedef struct dNode {//每個(gè)頭結(jié)點(diǎn)后緊跟的單位結(jié)點(diǎn)int data;struct dNode * next; }dNode; typedef struct mNode {//鄰接表中每一行的頭結(jié)點(diǎn)typeNode data;dNode * first;//指向第一個(gè)有效的后繼結(jié)點(diǎn) }mNode; typedef struct {mNode vNode[N];//所有頭結(jié)點(diǎn)int vNum, eNum;//圖中頂點(diǎn)的數(shù)量和邊數(shù)量 }zNode; void init(zNode &ZNode) {printf("規(guī)定頂點(diǎn)從0開始取\n");scanf_s("%d%d", &ZNode.vNum, &ZNode.eNum);//輸入有向圖的頂點(diǎn)數(shù)和邊數(shù)for (int i = 0; i < ZNode.vNum; i++) {//規(guī)定頂點(diǎn)從0開始取scanf_s("%d", &ZNode.vNode[i].data);ZNode.vNode[i].first = NULL;}for (int i = 0; i < ZNode.eNum; i++) {int u, v,weight;scanf_s("%d%d%d", &u, &v,&weight);//u頂點(diǎn)到v頂點(diǎn)有邊dNode* p = new dNode();ZNodeMatrix[u][v] = weight;p->data = v;p->next = ZNode.vNode[u].first;//只有指針域,指向地址ZNode.vNode[u].first= p;} } void print(zNode ZNode) {printf("遍歷鏈表:\n");for (int i = 0; i < ZNode.vNum; i++) {dNode* temp = ZNode.vNode[i].first;printf("%d ->", ZNode.vNode[i].data);while(temp){printf("%d ->",temp->data);temp = temp->next;}printf("NULL\n");} } void calculate(zNode ZNodeReverse) {//返回有向圖每個(gè)頂點(diǎn)的入度//每個(gè)頂點(diǎn)的入度for (int i = 0; i < ZNodeReverse.vNum; i++) {int tempLength = 0;dNode* p = new dNode();p = ZNodeReverse.vNode[i].first;while (p) {tempLength ++;p = p->next;}degree[i] = tempLength;} } bool tuoPuSort(zNode ZNode,int result[],stack &Stack) {//拓?fù)渑判蛑皇钦业綄W(xué)習(xí)的先后依賴順序,并不是排序int count = 0;//計(jì)數(shù)for (int i = 0; i < ZNode.vNum; i++) {if (!degree[i]) {//對入度為0的點(diǎn)入棧push(Stack, i);}}while (!empty(Stack)) {dNode* p ;int tempV = getTop(Stack);result[count] = tempV;count++;int e=0;pop(Stack, e);p = ZNode.vNode[tempV].first;//取以tempV頂點(diǎn)為入度點(diǎn)while (p) {//和tempV相連的鄰接邊的入度減1int v = p->data;degree[v]--;if (!degree[v]) {push(Stack, v);}p = p->next;}}if (count < ZNode.vNum) {return false;}else {return true;} } void keyPath(zNode ZNode) {//計(jì)算關(guān)鍵路徑//初始化int k;for (int i = 0; i < ZNode.vNum; i++) {ve[i] = 0;}//計(jì)算結(jié)點(diǎn)(事件)的最早發(fā)生時(shí)間for (int i = 0; i < ZNode.vNum; i++) {k = result[i];//按照拓?fù)渑判虻捻樞蛴?jì)算事件的最早發(fā)生時(shí)間dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;if (ve[k] + ZNodeMatrix[k][j] > ve[j]) {//最大值ve[j] = ve[k] + ZNodeMatrix[k][j];}p = p->next;}}//初始化事件最晚發(fā)生的時(shí)間for (int i = 0; i < ZNode.vNum; i++) {vl[i] = ve[result[ZNode.vNum - 1]];}//計(jì)算結(jié)點(diǎn)(事件)的最遲發(fā)生時(shí)間,從后往前計(jì)算for (int i = ZNode.vNum-1; i >=0 ; i--) {k = result[i];//按照拓?fù)渑判虻捻樞蛴?jì)算事件的最遲發(fā)生時(shí)間dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;if (vl[k]>vl[j]- ZNodeMatrix[k][j]) {//最小值vl[k] = vl[j] - ZNodeMatrix[k][j];}p = p->next;}}int sum = 0;printf("關(guān)鍵路徑如下:\n");//計(jì)算邊(活動(dòng))的最早和遲發(fā)生時(shí)間for (int i = 0; i < ZNode.vNum; i++) {k = result[i];//按照拓?fù)渑判虻捻樞蛴?jì)算邊(活動(dòng))的最早和遲發(fā)生時(shí)間dNode* p = ZNode.vNode[k].first;while (p != NULL) {int j = p->data;int e = ve[k];int l = vl[j] - ZNodeMatrix[k][j];if (e == l) {sum+= ZNodeMatrix[k][j];printf("(%d,%d) ", k, j);}p = p->next;}}printf("關(guān)鍵路徑長度為%d:\n",sum); } int main() {zNode ZNode,ZNodeReverse;printf("鄰接表的構(gòu)造:\n");init(ZNode);print(ZNode);printf("逆鄰接表的構(gòu)造:\n");init(ZNodeReverse);print(ZNodeReverse);calculate(ZNodeReverse);stack Stack;init(Stack);printf("拓?fù)湫蛄腥缦? ");if (tuoPuSort(ZNode, result,Stack)) {printf("\n可以構(gòu)成拓?fù)湫蛄?#xff01;");};for (int i = 0; i < ZNode.vNum; i++) {printf("%d ", result[i]);}printf("\n");keyPath(ZNode);//關(guān)鍵路徑計(jì)算system("pause");return 0; }測試截圖:
時(shí)間復(fù)雜度O(n+e),空間復(fù)雜度O(n+e)
如果存在什么問題,歡迎批評指正!謝謝!
總結(jié)
以上是生活随笔為你收集整理的数据结构---关键路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: e网云是怎么推广关键词的(关键词词云怎么
- 下一篇: word List16