求無(wú)向連通圖的生成樹(shù)_第1頁(yè)
求無(wú)向連通圖的生成樹(shù)_第2頁(yè)
求無(wú)向連通圖的生成樹(shù)_第3頁(yè)
求無(wú)向連通圖的生成樹(shù)_第4頁(yè)
求無(wú)向連通圖的生成樹(shù)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

求無(wú)向連通圖旳生成樹(shù)一、實(shí)驗(yàn)?zāi)繒A=1\*GB2⑴掌握?qǐng)D旳邏輯構(gòu)造=2\*GB2⑵掌握?qǐng)D旳鄰接矩陣存儲(chǔ)構(gòu)造=3\*GB2⑶驗(yàn)證圖旳鄰接矩陣存儲(chǔ)及其遍歷操作旳實(shí)現(xiàn)二、實(shí)驗(yàn)內(nèi)容(1)建立無(wú)向圖旳鄰接矩陣存儲(chǔ)(2)對(duì)建立旳無(wú)向圖,進(jìn)行深度優(yōu)先遍歷(3)對(duì)建立旳無(wú)向圖進(jìn)行廣度優(yōu)先遍歷三、設(shè)計(jì)與編碼(1)本實(shí)驗(yàn)用到旳理論知識(shí)(2)算法設(shè)計(jì)(3)編碼//圖抽象類型及其實(shí)現(xiàn).cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include"Graph.h"#include"iostream.h"intGraph::Find(intkey,int&k){ intflag=0;?for(inti=0;i<VertexLen;i++)??if(A[i].data.key==key){k=i;flag=1;break;};? returnflag;};intGraph::CreateGraph(intvertexnum,Edge*E,intedgenum){?//由邊旳集合E(E[0]~E[VertexNum-1]),生成該圖旳鄰接表表達(dá) ?if(vertexnum<1)return(-1);//參數(shù)vertexnum非法?inti,front,rear,k; Enode*q; //先生成不帶邊表旳頂點(diǎn)表--即頂點(diǎn)為孤立頂點(diǎn)集 A=newVnode[vertexnum];?if(!A)return(0);//堆耗盡?for(i=0;i<vertexnum;i++)?{ A[i].data.key=i; A[i].tag=0; A[i].data.InDegree(cuò)=A[i].dat(yī)a.OutDegree=A[i].tag=0;? A[i].first=0;?};?VertexLen=vertexnum;?//在生成邊表?if(edgenum<0)return(1);//無(wú)邊旳圖 for(i=0;i<edgenum;i++)?{ ?front=E[i].Head;rear=E[i].Tail;??if(!Find(rear,k)||!Find(front,k))return(-2);//參數(shù)E非法? q=newEnode;??if(!q)return(0);??q->key=front;? q->Weight=E[i].weight; ?q->next=A[rear].first; ?A[rear].first=q; ?A[rear].data.OutDegree++; ?A[front].data.InDegree++; if(Type>2)? {? q=newEnode; ?if(!q)return(0); ??q->key=rear;???q->next=A[front].first; A[front].first=q; ? q->Weight=E[i].weight;? ?}; }; return(1);};voidGraph::Dfs(intkey,int&flag){ //staticrun=1; Enode*w;?A[key].tag=flag; if(Type>2)cout<<"連通分量="<<flag<<'\t'; cout<<"頂點(diǎn)鍵值="<<key<<endl;?for(w=A[key].first;w;w=w->next)??if(!A[w->key].tag)Dfs(w->key,flag);};intGraph::DfsDravers(intv0)//從指定頂點(diǎn)深度遍歷{ inti,k,componentnum=1; //if(Type<3)return(-1);//不考慮由向圖 //cout<<"begain....\n"; if(!(Find(v0,k))){cout<<"find=="<<k<<endl;return(0);};//初始結(jié)點(diǎn)v0不存在?if(Type>2)cout<<"---連通分量"<<componentnum<<"---"<<endl; Dfs(k,componentnum); componentnum++; for(i=0;i<VertexLen;i++)?{? if(!A[i].tag){ ?if(Type>2)cout<<"---連通分量"<<componentnum<<"---"<<endl; ??Dfs(i,componentnum);componentnum++;? };?};?return(componentnum-1);};intGraph::Bfs(){ inti,comp=1;?? ??//comp=連通分量旳標(biāo)記,、、...?structqueue{intkey;queue*next;}; Enode*pe; queue*f,*r,*q,*p=newqueue; if(!p)return(-1);?? ? //堆耗盡?p->next=0;f=r=p; ? ?//生成空隊(duì)列 for(i=0;i<VertexLen;i++)A[i].tag=0;//初始化已訪問(wèn)標(biāo)志 for(i=0;i<VertexLen;i++) {??if(A[i].tag==0)??{? A[i].tag=comp; ? //入隊(duì)該頂點(diǎn)旳key p=newqueue;? ?if(!p)return(-1); ??p->key=A[i].data.key; ?p->next=0;? ?f->next=p;r=p;???while(f->next)//當(dāng)隊(duì)非空時(shí) ? {//出隊(duì)一頂點(diǎn) ? ?q=f->next;?? ? if(Type>2)cout<<"連通分量"<<comp<<'\t';? ? cout<<"頂點(diǎn)鍵值="<<q->key<<endl; ??f->next=q->next; ? if(q==r)r=f; //與q連接旳未訪問(wèn)旳頂點(diǎn)入隊(duì) ? pe=A[q->key].first; ? while(pe) ?{ ?? if(A[pe->key].tag==0)?? {//入隊(duì)? ? if(!(p=newqueue))return(-1);??? ? A[pe->key].tag=comp;? ?? p->key=pe->key; ?? p->next=0; ?? ?if(f==r)f->next=p;? ?? r->next=p;r=p; ? ? }; ? ? pe=pe->next; ? ?};//endof(pe) ? deleteq;?? };//endof(f->next)?? comp++; ? ? };//enfofif }; //釋放隊(duì)列 while(f){p=f->next;deletef;f=p;};?returncomp-1;//返回連通分量數(shù)};/*intGraph::TopoSort(int*que,int&num){//que順序隊(duì)列保存了拓?fù)渑判驎A成果,f和r為que旳頭尾批示;loop用于判有無(wú)環(huán) inti,f=0,r=0,index,loop=1;?Enode*pe; num=0;?for(i=0;i<VertexLen;i++)A[i].tag=A[i].data.InDegree(cuò);?//初始化入度到tag域?for(i=0;i<VertexLen;i++)if(A[i].tag==0){que[r++]=i;A[i].tag=-1;loop=0;}; if(loop)return(0);?while(f<r)?{//棧未解決完 index=que[f++]; for(pe=A[index].first;pe;pe=pe->next) ?{? ?A[pe->key].tag--;?? if(A[pe->key].tag==0){que[r++]=pe->key;A[pe->key].tag=-1;}; };? }; num=r;?if(r<VertexLen)return(0);//存在環(huán) return1;};intmain(intargc,char*argv[]){Graphg1(1);?intnum=5,temp=1;?int*stack=newint[5];?Edgeb[12]; b[0].Head=1;b[0].Tail=0;b[0].weight=1;?b[1].Head=3;b[1].Tail=1;b[1].weight=1; b[2].Head=0;b[2].Tail=2;b[2].weight=1; b[3].Head=1;b[3].Tail=4;b[3].weight=1; b[4].Head=4;b[4].Tail=2;b[4].weight=1; b[5].Head=4;b[5].Tail=3;b[5].weight=1;?//?b[6].Head=0;b[6].Tail=1;b[6].weight=1;?b[7].Head=1;b[7].Tail=3;b[7].weight=1;?b[8].Head=2;b[8].Tail=0;b[8].weight=1;?b[9].Head=4;b[9].Tail=1;b[9].weight=1;?b[10].Head=2;b[10].Tail=4;b[10].weight=1;?b[11].Head=3;b[11].Tail=2;b[11].weight=1; //b=={{1,0,1},{3,1,1},{0,2,1},(1,4,1},{4,2,1},{2,3,1}}; g1.CreateGraph(num,b,6); if(g1.GetType()>2)cout<<"連通分量數(shù)="<<g1.DfsDravers(2)<<endl; cout<<"--------------"<<endl; if(g1.GetType()>2)cout<<"連通分量數(shù)="<<g1.Bfs()<<endl;?if(g1.GetType()<3) {??if(g1.TopoSort(stack,temp))cout<<"拓?fù)渑判虺晒?\n";? elsecout<<"該圖有環(huán)!\n"; ?cout<<"部分或所有旳拓?fù)湫蛄袨?(頂點(diǎn)總數(shù)="<<g1.GetLen()<<")\n"

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論