版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
圖的鄰接表存儲(chǔ)方式——數(shù)組實(shí)現(xiàn)初探焦作市外國(guó)語中學(xué)岳衛(wèi)華在圖論中,圖的存儲(chǔ)結(jié)構(gòu)最常用的就是就是鄰接表和鄰接矩陣。一旦頂點(diǎn)的個(gè)數(shù)超過5000,鄰接矩陣就會(huì)“爆掉〞空間,那么就只能用鄰接表來存儲(chǔ)。比方noip09的第三題,如果想過掉全部數(shù)據(jù),就必須用鄰接表來存儲(chǔ)。但是,在平時(shí)的教學(xué)中,發(fā)現(xiàn)用動(dòng)態(tài)的鏈表來實(shí)現(xiàn)鄰接表實(shí)現(xiàn)時(shí),跟蹤調(diào)試很困難,一些學(xué)生于是就覺得鄰接表的存儲(chǔ)方式很困難。經(jīng)過查找資料,發(fā)現(xiàn),其實(shí)完全可以用靜態(tài)的數(shù)組來實(shí)現(xiàn)鄰接表。本文就是對(duì)這種方式進(jìn)行探討。我們知道,鄰接表是用一個(gè)一維數(shù)組來存儲(chǔ)頂點(diǎn),并由頂點(diǎn)來擴(kuò)展和其相鄰的邊。具體表示如下列圖:其相應(yīng)的類型定義如下:typepoint=^node;node=recordv:integer;//另一個(gè)頂點(diǎn)next:point;//下一條邊end;vara:array[1..maxv]ofpoint;而用數(shù)組實(shí)現(xiàn)鄰接表,那么需要定義兩個(gè)數(shù)組:一個(gè)是頂點(diǎn)數(shù)組,一個(gè)是邊集數(shù)組。頂點(diǎn)編號(hào)結(jié)點(diǎn)相臨邊的總數(shù)s第一條鄰接邊next此邊的另一鄰接點(diǎn)邊權(quán)值下一個(gè)鄰接邊對(duì)于上圖來說,具體的鄰接表就是:由上圖我們可以知道,和編號(hào)為1的頂點(diǎn)相鄰的有3條邊,第一條邊在邊集數(shù)組里的編號(hào)是5,而和編號(hào)為5同一個(gè)頂點(diǎn)的下條邊的編號(hào)為3,再往下的邊的編號(hào)是1,那么和頂點(diǎn)1相鄰的3條邊的編號(hào)分別就是5,3,1。同理和頂點(diǎn)3相鄰的3條邊的編號(hào)分別是11,8,4。如果理解數(shù)組表示鄰接表的原理,那么實(shí)現(xiàn)就很容易了。類型定義如下:typenode=record//點(diǎn)集數(shù)組s,next:longint;//s為與第i個(gè)點(diǎn)相臨的邊有多少個(gè),next為第一條邊的編號(hào)為多少?end;edge=record//邊集數(shù)組y,v,next:longint;//y為這條邊的另一個(gè)頂點(diǎn),v為權(quán)值,next為和第i個(gè)節(jié)點(diǎn)相臨的另一條邊,next為0那么表示結(jié)束。end;vara:array[1..maxn]ofnode;e:array[1..maxm]ofedge;見圖的代碼和動(dòng)態(tài)鄰接表類似:readln(x1,y1,v1);inc(m);e[m].y:=y1;e[m].v:=v1;e[m].next:=a[x1].next;a[x1].next:=m;inc(a[x1].s);inc(m);e[m].y:=x1;e[m].v:=v1;e[m].next:=a[y1].next;a[y1].next:=m;inc(a[y1].s);下面提供一道例題邀請(qǐng)卡分發(fā)deliver.pas/c/cpp【題目描述】AMS公司決定在元旦之夜舉辦一個(gè)盛大展覽會(huì),將廣泛邀請(qǐng)各方人士參加?,F(xiàn)在公司決定在該城市中的每個(gè)汽車站派一名員工向過往的行人分發(fā)邀請(qǐng)卡。
但是,該城市的交通系統(tǒng)非常特別,每條公共汽車線路都是單向的,且只包含兩個(gè)車站,即起點(diǎn)站與終點(diǎn)站,汽車從起點(diǎn)到終點(diǎn)站后空車返回。
假設(shè)AMS公司位于1號(hào)車站,每天早上,這些員工從公司出發(fā),分別到達(dá)各自的崗位進(jìn)行邀請(qǐng)卡的分發(fā),晚上再回到公司。
請(qǐng)你幫AMS公司編一個(gè)程序,計(jì)算出每天要為這些分發(fā)邀請(qǐng)卡的員工付的交通費(fèi)最少為多少?【輸入文件】輸入文件的第一行包含兩個(gè)整數(shù)P和Q〔1<=P<=10000,0<=Q<=20000〕。P為車站總數(shù)〔包含AMS公司〕,Q為公共汽車線路數(shù)目。接下來有Q行,每行表示一條線路,包含三個(gè)數(shù):起點(diǎn),終點(diǎn)和車費(fèi)。所有線路上的車費(fèi)是正整數(shù),且總和不超過1000000000。并假設(shè)任何兩個(gè)車站之間都可到達(dá)?!据敵鑫募枯敵鑫募H有一行為公司花在分發(fā)邀請(qǐng)卡員工交通上的最少費(fèi)用?!緲永斎搿緾ase1:22
1213
2133Case2:46
1210
2160
1320
3410
245
4150【樣例輸出】Case1:46Case2:210【分析】此題是一道根本最短路徑問題,但是如果想通過全部數(shù)據(jù),10000個(gè)點(diǎn),20000條邊,必須用鄰接表來實(shí)現(xiàn)。下面給出此題目用dijkstra和spfa兩種算法的實(shí)現(xiàn)。programdelive_dijstrkalr;constinf='deliver.in';ouf='deliver.out';maxm=20000;maxn=10000;typenode=records,next:longint;//s為與第i個(gè)點(diǎn)相臨的邊有多少個(gè),next為第一條邊的編號(hào)為多少?end;edge=recordy,v,next:longint;//y為這條邊的另一個(gè)頂點(diǎn),v為權(quán)值,next為和第i個(gè)節(jié)點(diǎn)相臨的另一條邊,next為0那么表示結(jié)束。end;vari,j,k,m,n,x1,y1,w1,ans:longint;a,a1:array[1..maxn]ofnode;e,e1:array[1..maxm]ofedge;d,d1:array[1..maxn]oflongint;proceduredij;vari,j,k,min,jj,kk:longint;f:array[1..maxn]ofboolean;beginfillchar(d,sizeof(d),$7f);fillchar(f,sizeof(f),false);j:=a[1].next;fori:=1toa[1].sdobegink:=e[j].y;d[k]:=e[j].v;j:=e[j].next;end;//用鄰接表來找和第1個(gè)點(diǎn)相臨的點(diǎn),并給d數(shù)組賦初值。。。。f[1]:=true;d[1]:=0;fori:=2tondobeginmin:=maxlongint;k:=0;forj:=1tondoif(notf[j])and(d[j]<min)thenbeginmin:=d[j];k:=j;end;ifk=0thenexit;f[k]:=true;jj:=a[k].next;forj:=1toa[k].sdobeginkk:=e[jj].y;if(notf[kk])and(d[k]+e[jj].v<d[kk])thend[kk]:=d[k]+e[jj].v;jj:=e[jj].next;end;//鄰接表的使用,要好好注意。。。end;end;beginassign(input,inf);reset(input);assign(output,ouf);rewrite(output);fillchar(a,sizeof(a),0);fillchar(e,sizeof(e),0);fillchar(a1,sizeof(a1),0);fillchar(e1,sizeof(e1),0);readln(n,m);fori:=1tomdobeginreadln(x1,y1,w1);e[i].y:=y1;e[i].v:=w1;e[i].next:=a[x1].next;a[x1].next:=i;inc(a[x1].s);e1[i].y:=x1;e1[i].v:=w1;e1[i].next:=a1[y1].next;a1[y1].next:=i;inc(a1[y1].s);end;dij;d1:=d;a:=a1;e:=e1;dij;ans:=0;fori:=2tondoans:=ans+d[i]+d1[i];writeln(ans);close(input);close(output);gramdeliver;constinf='deliver.in';ouf='deliver.out';maxm=20000;maxn=10000;typenode=records,next:longint;//s為與第i個(gè)點(diǎn)相臨的邊有多少個(gè),next為第一條邊的編號(hào)為多少?end;edge=recordy,v,next:longint;//y為這條邊的另一個(gè)頂點(diǎn),v為權(quán)值,next為和第i個(gè)節(jié)點(diǎn)相臨的另一條邊,next為0那么表示結(jié)束。end;vari,j,k,m,n,x1,y1,w1,ans:longint;a,a1:array[1..maxn]ofnode;e,e1:array[1..maxm]ofedge;d,d1:array[1..maxn]oflongint;q:array[1..100000]oflongint;procedurespfa;//spfa是基于邊的松弛操作的最短路徑求法。根本原理就是vari,j,k,now,min,t,w:longint;f:array[1..maxn]ofboolean;beginfillchar(d,sizeof(d),$7f);fillchar(f,sizeof(f),false);fillchar(q,sizeof(q),0);d[1]:=0;t:=1;f[1]:=true;w:=1;q[t]:=1;repeatk:=q[t];j:=a[k].next;fori:=1toa[k].sdobeginnow:=e[j].y;ifd[now]>d[k]+e[j].vthenbegind[now]:=d[k]+e[j].v;ifnotf[now]thenbegininc(w);q[w]:=now;f[now]:=true;end;end;j:=e[j].next;end;f[k]:=false;inc(t);untilt>w;end;beginassign(input,inf);reset(input);assign(output,ouf);rewrite(output);fillchar(a,sizeof(a),0);fillchar(e,sizeof(e),0);fillchar(a1,sizeof(a1),0);fillchar(e1,sizeof(e1),0);readln(n,m);fori:=1tomdobeginreadln(x1,y1,w1);e[i].y:=y1;e[i].v:=w1;e[i].next:=a[x1].next;a[x1].next:=i;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技助力冰雪運(yùn)動(dòng)心理克服恐懼
- 2025年人教新課標(biāo)八年級(jí)歷史下冊(cè)月考試卷含答案
- 2025年人教版PEP選擇性必修3化學(xué)上冊(cè)月考試卷含答案
- 2025年新世紀(jì)版高二歷史下冊(cè)月考試卷
- 2025年浙教版八年級(jí)地理上冊(cè)月考試卷含答案
- 二零二五年度文化展覽館導(dǎo)覽員勞動(dòng)合同模板4篇
- 二零二五年度環(huán)保設(shè)備銷售合同約定乙方甲方售后服務(wù)賠償細(xì)則4篇
- 二零二五年度廚房設(shè)備智能化改造升級(jí)合同12篇
- 二零二五年度農(nóng)產(chǎn)品深加工訂單加工合作合同模板3篇
- 2025年度農(nóng)業(yè)科技創(chuàng)新項(xiàng)目合作開發(fā)合同4篇
- 拉薩市2025屆高三第一次聯(lián)考(一模)語文試卷(含答案解析)
- 《保密法》培訓(xùn)課件
- 回收二手機(jī)免責(zé)協(xié)議書模板
- (正式版)JC∕T 60023-2024 石膏條板應(yīng)用技術(shù)規(guī)程
- 人教版高中生物學(xué)新舊教材知識(shí)差異盤點(diǎn)
- (權(quán)變)領(lǐng)導(dǎo)行為理論
- 2024屆上海市浦東新區(qū)高三二模英語卷
- 2024年智慧工地相關(guān)知識(shí)考試試題及答案
- GB/T 8005.2-2011鋁及鋁合金術(shù)語第2部分:化學(xué)分析
- 不動(dòng)產(chǎn)登記實(shí)務(wù)培訓(xùn)教程課件
- 不銹鋼制作合同范本(3篇)
評(píng)論
0/150
提交評(píng)論