清華考研真題第七章圖_第1頁
清華考研真題第七章圖_第2頁
清華考研真題第七章圖_第3頁
清華考研真題第七章圖_第4頁
清華考研真題第七章圖_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

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

文檔簡介

StatusBuild_AdjList(ALGraph&G)//輸入有向圖的頂點(diǎn)數(shù),邊數(shù),頂點(diǎn)信息和邊的信息{if(v<0)returnERRORif(a<0)returnERROR();//{t=getchar();h=getchar();//t為弧尾,h為弧頭if((i=LocateVex(G,t))<0)returnERROR;if((j=LocateVex(G,h))<0)returnERROR;//頂點(diǎn)未找到 if(!G.vertices.[i].firstarc)G.vertices[i].firstarc=p;{ }returnOK;StatusInsert_Vex(MGraph&G,charv)//在鄰接矩陣表示的圖G上頂點(diǎn){if(G.vexnum+1)>MAX_VERTEX_NUMreturnINFEASIBLE;returnStatusInsert_Araph&G,charv,charw)//在鄰接矩陣表示的圖G上邊{if((i=LocateVex(G,v))<0)returnERROR;if((i=LocateVex(G,v))<0)returnERROR;if(i==j)returnERROR;{}return{G.vexs[m]<->G.vexs[n將待刪除頂點(diǎn)交換到最后一個(gè)頂點(diǎn){G.arcs[m][i]=G.arcs[n][i將邊的關(guān)系隨之交換}returnOK;returnStatusDelete_Araph&G,charv,charw)//在鄰接矩陣表示的圖G上刪除邊{if((i=LocateVex(G,v))<0)returnERROR;{}returnStatusInsert_Arc(ALGraph&G,charv,charw)//在鄰接表表示的圖G上邊{if((i=LocateVex(G,v))<0)returnERROR;p=(ode*)malloc(sizeof(ode));if(!G.vertices[i].firstarc)G.vertices[i].firstarc=p;{ if(q->adjvex==j)returnERROR;//邊已經(jīng)存在}return{{)//{ }else{{ }{)//{ }else{{ }{G.xlist[i]=G.xlist[i+1修改表頭向量--;//}returnOK;returnOK;{if((i=LocateVex(G,v))<0)returnERROR;{if(!p)returnERROR;//未找到i{if(!p)returnERROR;//未找到ireturnOK;{if(v<0)returnERRORif(a<0)returnERROR();//{{t=getchar();h=getchar();//t為弧尾,h為弧頭if((i=LocateVex(G,t))<0)returnERROR;if((j=LocateVex(G,h))<0returnERROR頂點(diǎn)未找到p->ilink=NULL;p->jlink=NULL;//邊結(jié)點(diǎn)賦初值if(!G.adjmulist[i].firstedgeG.adjmulist[i].firstedge=p;{{ }if(r->ivex==ir->ilink=p;//iivex域中,elser->jlink=p;//jvex域中}//else//i鏈表尾if(!G.adjmulist[j].firstedge)G.adjmulist[j].firstedge=p;{{{ }elser->ilink=p;}//else//j鏈表尾returnOK;{{])return1;intPass_ALGraph(ALGraphG)//判斷一個(gè)鄰接表的有向圖是不是可傳遞的,是則返1,0{{{if(z!=x&&!is_adj(G,x,z))return0;intis_adj(ALGraphG,intm,intn)//G中是否存在邊(m,n),1,否0{if(p->adjvex==n)return1;return];//intexist_path_DFS(ALGraphG,inti,intj)//Gi{if(i==jreturn1;ij{{))intexist_path_BFS(ALGraphG,inti,intj)//Gi{intvisited[MAXSIZE];{{if(k==j)return1;return{{intvisited=1;{{{);//}{{}{]));//if(!indegree[iPush(S,i零入度結(jié)點(diǎn)入棧{new[i]=n{if(count<G.vexnum)returnERROR;//圖中存在環(huán)for(i=1;i<=n;iprintf("OldNo:%dNewNo:%d\n",i,new[i])returnOK;分析:只要按仄逆序?qū)旤c(diǎn),就可以使鄰接矩陣成為下三角矩陣.intintexist_path_len(ALGraphG,inti,intj,intk)//判斷鄰接表方式的有向圖ijk{{if(i==j&&k==0return1;找到了一條路徑,且長度符合要求elseif(k>0){{))//return0;];//intFind_All_Path(ALGraphG,intu,intv,intk)//Guv之間的所有簡單路徑,k表示當(dāng)前路徑長度{path[k]=u;加入當(dāng)前路徑中//{printf("Foundone++)]);//}{]));//}path[k]=0;回溯{intGetPathNum_Len(ALGraphG,inti,intj,intlen)//求鄰接表方式的有向圖ijlen的簡單路徑條數(shù)ijlen{if(i==j&&len==0)return1;找到了一條路徑,且長度符合要求elseif(len>0){sum=0;//sum表示通過本結(jié)點(diǎn)的路徑數(shù){returnsum;intintpath[MAXSIZEintcycount=0;{for(v=0;v<G.vexnum;v++)visited[v]=0;]));//voidDFS(ALGraphG,intv,intk)//k{path[k]=v;//記錄當(dāng)前路徑{else//發(fā)現(xiàn)了一條回路{for(i=0;path[i]!=w;i++);//找到回路的起點(diǎn)for(j=0;path[i+j];i++)thiscycle[j]=path[i+j];//把回路下來())++)////intexist_cycle()//thiscycle數(shù)組中記錄的回路在cycles{int++)//{//也就是,所有結(jié)點(diǎn)和它們的順序都相同j=0;c=thiscycle�例如,142857857142是相同的回路])//{ pare(temp,thiscyclethiscycle比較return1;//完全相等++)//}return0;thiscycle明存在一條回路;掃描路徑向量path可以獲得這條回的所有結(jié)點(diǎn).把結(jié)點(diǎn)序列(例如,142857)thiscycle中;由于這種算法中,一條回路會(huì)被發(fā)現(xiàn)好幾次,所以必須先判斷該cycles中被記錄過,cycles的一個(gè)行向量中.把cycles的每一個(gè)行向量取出來與之比較.由于一條回路可能有多種順序,比如142857等同于285714571428,所以還要調(diào)整行向量的次序,并存入temp數(shù)組,例如,thiscycle142857第一個(gè)結(jié)1,cycles的當(dāng)前向量為857142,則找到后者中的1,1后部分提到1前部分intvisited[MAXSIZE];intfinished[MAXSIZE];intcountcount在第一次深度優(yōu)先遍歷中用于指示finished{{++)//++)//--)//{{printf("\n不同的強(qiáng)連通分量在不同的行輸出}voidDFS1(OLGraphG,intv)//{{if(!visited[w])DFS1(G,w);finished[++count]=v;在第一次遍歷中建立finishedvoidDFS2(OLGraphG,intv)//{printf("%d",v在第二次遍歷中輸出結(jié)點(diǎn)序號(hào){if(!visited[w])DFS2(G,w);分析:求有向圖的強(qiáng)連通分量的算法的時(shí)間復(fù)雜度和深度優(yōu)先遍歷相同,也為O(n+e).voidForest_Prim(ALGraphG,intk,CSTree&T)//從頂點(diǎn)k出發(fā),構(gòu)造鄰接表結(jié)構(gòu)的有向GT,用孩子兄弟鏈表{{{{elseForest_Prim(G,k);//對(duì)另外通分量執(zhí)行算voidAddto_Forest(CSTree&T,inti,intj)//把邊(i,j)添加到孩子兄弟鏈表表示的樹T中{p=Locate(T,iip,過程略q-//{p-}//作為新樹到最右elseif(!p->firstchild)p->firstchild=q;作為雙親的第一個(gè)孩子else//雙親已經(jīng)有了孩子{//}{T=(CSTNode*)malloc(sizeof(CSTNode建立樹根T=(CSTNode*)malloc(sizeof(CSTNode建立樹根分析:Prim算法的基礎(chǔ)上添加了非連通圖支持和孩子兄弟鏈表構(gòu)建模塊而得到的,其時(shí)間復(fù)雜度為O(n^2).typedefstructintvex;intecno;}VexInfovexs[MAXSIZE記錄結(jié)點(diǎn)所屬連通分量號(hào)的數(shù)組voidInit_VexInfo(VexInfo&vexs[],intvexnum)//初始化{};//intis_ec(VexInfovexs[],inti,intj)//判斷頂點(diǎn)i和頂點(diǎn)j是否屬于同通分{ o)return1;elsereturn0;elsereturnvoidmerge_ec(VexInfo&vexs[intec1,intec2)//ec1{ o==ec2) voidMinSpanTree_Kruscal(GraphG,EdgeSetType&EdgeSet,CSTree&T)//求圖的最小{ecnum=G.vexnum連通分量個(gè)數(shù){GetMinEdge(EdgeSet,u,v);//選出最短邊if(!is_ec(vexs,u,vuv屬于不同連通分量{Addto_CSTree(T,u,v);//加入到生成樹中 o);//合并連通分量});//T{p=Locate(T,iip,過程略q-//p->firstchild=q;作為雙親的第一個(gè)孩子else//雙親已經(jīng)有了孩子{//},并存入數(shù)組new{{];//if(!indegree[i])Push(S,i);{Pop(S,i);new[i]=++count把拓?fù)漤樞虼嫒霐?shù)組的對(duì)應(yīng)分量中{}if(count<G.vexnum)returnERROR;returnOK;int{{{for(w=0;w<G.vexnum;w++)visited[w]=0;//每次都要將數(shù)組清零DFS(G,v);//v出發(fā)進(jìn)行深度優(yōu)先遍歷if(!visited[w])flag=0;//如果v是根,則深度優(yōu)先遍歷可以到所有結(jié)if(flag)printf("FoundarootvoidDFS(ALGraphG,intv){{if(!visited[w])DFS(G,w);}voidFill_MPL(ALGraph&G)//GMPL{])intGet_MPL(ALGraph&G,inti)//從一個(gè)頂點(diǎn)出發(fā)構(gòu)建MPL域并返回其MPL{{return0;零出度頂點(diǎn)}{{if(k>max)max=k;MPL}G.vertices[i]=max+1;//再加一,就是當(dāng)前頂點(diǎn)的MPLreturnmax+1;intmaxlen,path[MAXSIZE];//數(shù)組path用于當(dāng)前路intmlp[MAXSIZE];//數(shù)組mlp用于已發(fā)現(xiàn)的最長路{{])}printf("Longest++)]);//voidDFS(ALGraphG,inti,int{)//{{++)];//}{{}{]);//{if(!G.vertices[i].firstarcc是原子else//子表達(dá)式{}{{]);//returnintEvaluate_imp(ALGraphG,inti)//{if(G.vertices[i].tag=NUM)returnG.vertices[i].value;{returncalculate(v1,G.vertices[i].optr,v2);}分析:本題中,鄰接表的vertices向量的元素類型:struct{enumtag{NUM,OPTR};u

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論