學妹,你要的C語言版AOE網絡數據結構來了,就這么簡單!

文章目錄

  • AOE關鍵路徑編程
  • AOE完整求解程序

AOE關鍵路徑編程

在這里插入圖片描述
不難發現AOE圖最大特點是沒有回路,并且有向圖方向始終是從源點走向匯點,且源點匯點都是一個。

把圖1寫成鄰接矩陣文件,見文件P200G736.TXT,并在此復制G0.C到AOE.C,修改這個程序的讀文件名稱,使其正確讀出該文件的數據并構造圖。

分析圖1可知,該圖實際有以下路徑:

V1->V2->V5->V7->V9;
V1->V3->V5->V7->V9;
V1->V2->V5->V8->V9;
V1->V3->V5->V8->V9;
V1->V4->V6->V8->V9;

一共是5條路徑,這5條路徑上面的權值和最大者就是關鍵路徑。

很明顯,把上述5條路徑的V1合并成一個結點,則可以看這個結果實際是一個生成樹,這個生成樹上的結點或許是重復的,但要全部走完,則結果肯定是這樣的一棵樹,這樣的樹我們這里成為全路徑生成樹,或許N多教材沒這個稱謂,但要編程求解該問題則必然是要先解出該樹來、然后累計求和每個子樹上的權值和。

C#的程序上很容易做到這個樹,這個解就是:

在這里插入圖片描述

這樣的樹,實際是一種特殊的深度優先遍歷生成的結果。

回顧我們在普通的圖上做的深度優先遍歷,由于一般意義上的圖中存在回路,所以我們需要一個Visited[]這樣的數組、標記已經走過的頂點,從而制止了在一個回路上無限循環,但我們分析AOE圖則不難發現:我們不需要標記已經走過的頂點,深度優先遍歷也可以順利從源點到匯點走完。

手工完成這樣的遍歷不是問題,所以我們可以編寫出以下的程序來遍歷:

void AOETrav (struct Graph *G,int n)
{int i;if(G==NULL) return;printf("%d\t%s\n",n,G->pV[n]);for(i=0;i<G->num;i++)if(G->pA[n][i]!=0)AOETrav(G,i);
}

對照我們前面的深度優先遍歷函數:

void DFS(struct Graph *G,int n)
{int i;if(G==NULL) return;if(n<0||n>G->num) return;G->Visited[n]=1;printf("%s ",G->pV[n]); for(i=0;i<G->num;i++)if(G->pA[n][i]!=0&&G->Visited[i]!=1) 
DFS(G,i);
}

執行AOE1.c程序,則結果是:

V1、 V2、V5、V7、 V9、V8、V9、V3、V5、V7、V9、 V8、V9、V4、V6、V8、V9  

分析表1的程序以及結果不難發現:

<1> 如AOETrav( )函數入口參數n是生成樹父結點的話、那么在第8行進入下一個頂點時所找到的第i個頂點、則就是第n個結點的孩子;

<2> 如果設到第n個結點的權值累計合是w,則該函數就是這樣的入口參數:

void AOETrav (struct Graph *G,int n,int w)

有這樣的函數后,則在表1的第9行就是:

AOETrav(G,i, w+G->pA[n][i]);

也就是說:到第n個頂點的權值如果是w的話,則到第n個后的第i個頂點,其權值合計是:

w+A[n][i];

然后,我們設計一個雙親表示法的表格,按:
在這里插入圖片描述

void AOETrav (struct Graph *G,int n,int w)
{int i,nw;if(G==NULL) return;for(i=0;i<G->num;i++)if(G->pA[n][i]!=0){nw=w+G->pA[n][i]; printf("%d\t%d\t%s\t%d\n",i,n,G->pV[i],nw);AOETrav(G,i,nw);}
}

修改main()函數,使其從第0個頂點開始,就是:

main()
{int i,j;struct Stack *S;struct Graph *G;G=GraphCreat("p200G736.txt");printf("頂點名稱:\n");for(i=0;i<G->num;i++)printf("%s\t",G->pV[i]);printf("\n鄰接矩陣:\n");for(i=0;i<G->num;i++) {for(j=0;j<G->num;j++)printf("%d\t",G->pA[i][j]);printf("\n");}printf("\n");printf("ID\tPID\tV\tW\n");printf("%d\t%d\t%s\t%d\n",0,-1,G->pV[0],0);AOETrav(G,0,0);
}

運行這個程序,會有以下結果:

在這里插入圖片描述
至此,AOE的問題基本解決,查看表6,其最大權值是18,見上表第4行、第6行,如是第4行,則是V9,回溯PID=6到第3行V7、從V7取PID=4回到第2行V5、再從PID=1回到V2、從V2取PID=0回到V1,全路程就是:

V1、V2、V5、V7、V9,全路程權值合計是18

同理在第6行也有一條路徑:

V1、V3、V5、V8、V9,全路程權值和也是18,這也是一條關鍵路徑。

表6需要注意的是:由于這個樹上、一個結點可能出現在好幾個子樹上,所以父結點編號要尋找上面最近的結點編號。

AOE完整求解程序

上述解法、對小的AOE圖是可行的,但在大的圖上,很明顯對表6也需要進行編程處理,所以一個完整的AOE處理程序,還需要設計一個順序表、保存表6的結果,然后通過順序表求解出完整的計算結果。這個工作就留給同學們自己解決。

AOE2.c是通過一種簡單的方式、把各個路徑上的權值累計合計和路徑顯示出來的程序,請同學們自己分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題160之某個公司采用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下: 每位數字都加上 5,然后用和除以 10 的余數代替該數字,再將第一位和第四位交換,第二位和第三位

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:某個公司采用公用電話傳遞數…

C# 關于狀態機的實現(案例版)

大部分的狀態機都是有限狀態機&#xff0c;某些業務環境&#xff0c;或者其他環境中&#xff0c;如果有狀態機其實還是很方便的。比如&#xff0c;我是用在了單個客戶的Socket通信上&#xff0c;未連接狀態&#xff0c;我就等連接。已連接狀態&#xff0c;就等待下一步指令狀態…

測試并發應用 (一)監控Lock接口

聲明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第八章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 譯者&#xff1a;鄭玉婷 校對&#xff1a;方騰飛 監控Lock接口 Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界…

[There will be more story......]

This blog will keep on updating.轉載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根據生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "雙魚", "白羊", "金牛", "雙子"…

[轉]Android 項目的代碼混淆,Android proguard 使用說明

簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼&#xff0c;我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代碼的開源項目。它的主要作用就是混淆&#xff0c;當然它還能對字節碼進行縮減體積、優化等&#xff0c;但那些對于我們來說都算是次要…

數據結構與算法:終于可以用三種語言(C,C#,JavaScript)把圖的廣度優先遍歷講清楚了(推薦收藏)

文章目錄鄰接矩陣存儲圖的廣度優先遍歷過程分析C語言實現隊列編程程序中加入圖的處理函數結果的再次分析C#語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹JavaScript語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹鄰接矩陣存儲圖的廣度優先遍歷過程分析 對圖1這樣…

C語言試題161之求100000以內的自守數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:自守數是…

改造.NET遺留應用

淺議.NET遺留應用改造TLDR&#xff1a;本文介紹了遺留應用改造中的一些常見問題&#xff0c;并對改造所能開展的目標、原則、策略進行了概述。一、背景概述1、概述或許僅“遺留應用”這個標題就比較吸睛&#xff0c;因為我聽過太多人吐槽了。Robert Martin在《修改代碼的藝術》…

GitHub的DGit改進了平臺的可靠性、性能以及可用性

GitHub最近悄悄地發布了DGit&#xff0c;全稱為“分布式Git”。這是一種基于Git創建的分布式存儲系統&#xff0c;其目標是改進使用GitHub時的可靠性、可用性以及性能。\\DGit是一個應用層面的協議&#xff0c;它利用了Git分布式的特性&#xff0c;將每個倉庫在三臺不同的、獨立…

用靜態NAT實現外網PC訪問內網服務器

在我們的生產環境中常常處于安全考慮將服務器置于內網環境中&#xff0c;但同時得向外網提供各種服務功能&#xff0c;此時就需要用到NAT技術。下面是我用思科的仿真軟件搭建的一個實驗環境&#xff0c;實現外網PC訪問內網服務器。先說明一下實驗環境&#xff1a;路由器R0左邊為…

[轉]分布式事務之TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分布式事務解決方案&#xff0c;可用于解決跨庫操作的數據一致性問題&#xff1b; TCC是服務化的兩階段編程模型&#xff0c;其Try、Confirm、Cancel 3個方法均由業務編碼實現&#xff1b; 其中Try操作作為一階段&#xff0c;負責資源的檢查和…

量化投資策略的評估標準及其計算公式

收益率指標&#xff1a;分為策略的總收益率和策略的年化收益率 策略的總收益率&#xff1a; 策略的總收益率是評價一個策略盈利能力的最基本的指標&#xff0c;其計算方法為&#xff1a; 公式中Vt表示策略最終的股票和現金的總價值&#xff0c;V0表示策略最初的股票和現金的總…

.net post xml 數據

var request WebRequest.Create(url);//url 是post 接口的URL request.Method "post";// 請求方法 request.ContentType "text/xml"; //請求類型 request.Headers.Add("charset:utf-8"); //設置文檔類型的編碼格式 var encoding Encoding.Ge…

【ArcGIS微課1000例】0005:空間連接(Spatial Join)

問題描述 現在要根據范圍,怎樣批量統計各個范圍內的湖泊的總面積、各個省份內的鐵路或河流總長度、各個地區的人口綜合等。 空間連接 根據空間關系將一個要素類的屬性連接到另一個要素類的屬性。目標要素和來自連接要素的被連接屬性寫入到輸出要素類。 用法 空間連接是指根…

【微服務專題之】.Net6中集成消息隊列-RabbitMQ中直接路由模式

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注]前文回顧【微服務專題之】.Net6下集成消息隊列上-RabbitMQ【微服務專題之】.Net6下集成消息隊列2-RabbitM…

C語言試題162之圓周率π

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:圓周率π…

第14、15教學周作業

要求一 還差一些沒做完。 要求二 USTH_C程序設計&#xff08;基礎&#xff09;14周第一次PTA作業 7-3 將數組中的數逆序存放 1.實驗代碼 #include<stdio.h>int main() {int i,n,t;scanf("%d",&n);int a[n];for(i0;i<n;i){scanf("%d",&t)…

篇三:訪問JSON靜態文件

背景&#xff1a;在定位的時候帶出車牌號的前兩位&#xff0c;這里就有一個地址和車牌號前兩位的映射關系&#xff0c;這個映射關系起初是通過Ajax在頁面加載的時候請求去數據庫里面查出來賦給一個變量&#xff0c;然后去操作&#xff0c;但是這個過程通常需要4~7秒&#xff0c…

代理(Proxy)

2019獨角獸企業重金招聘Python工程師標準>>> 一、代理的概念 動態代理技術是整個java技術中最重要的一個技術&#xff0c;它是學習java框架的基礎&#xff0c;不會動態代理技術&#xff0c;那么在學習Spring這些框架時是學不明白的。 動態代理技術就是用來產生一個對…