首页 > 代码库 > 图的深度优先遍历--邻接表实现
图的深度优先遍历--邻接表实现
这里用邻接表实现图的深度优先遍历,采用递归实现。
#include<iostream> using namespace std; #define VERTEXNUM 5//结点数 struct edgenode { int to; int weight; // 边的权值 edgenode *next; }; struct vnode { int from; edgenode *first; }; void createGraph(vnode *adjilist, int start, int end,int weight); void displayGraph(vnode *adjilist,int nodeNum); void DFT(vnode *adjilist,int* vertexStatusArr,int nodeNum); void DFTcore(vnode *adjilist,int i,int* vertexStatusArr); int main(void){ //创建图 vnode adjilist[VERTEXNUM]; int nodeNum=VERTEXNUM; for(int i=0;i<nodeNum;i++) adjilist[i].first=NULL; int vertexStatusArr[VERTEXNUM]={0}; cout<<vertexStatusArr[4]<<endl; createGraph(adjilist,0,3,0); createGraph(adjilist,0,4,0); createGraph(adjilist,3,1,0); createGraph(adjilist,3,2,0); createGraph(adjilist,4,1,0); printf("after create:\n"); displayGraph(adjilist,nodeNum); //深度优先遍历 DFT(adjilist,vertexStatusArr,nodeNum); system("pause"); return 0; } //创建图,采取前插法 void createGraph(vnode *adjilist, int start, int end,int weight) { adjilist[start].from=start; edgenode *p=new edgenode; p->to=end; p->weight=weight; p->next=adjilist[start].first; adjilist[start].first=p; } //打印存储的图 void displayGraph(vnode *adjilist,int nodeNum) { int i,j; edgenode *p; for(i=0;i<nodeNum;i++) { p=adjilist[i].first; while(p) { cout<<‘(‘<<adjilist[i].from<<‘,‘<<p->to<<‘)‘<<endl; p=p->next; } } } //深度优先遍历 void DFT(vnode *adjilist, int* vertexStatusArr,int nodeNum) { printf("start BFT graph:\n"); int i; for(i=0;i<nodeNum;i++){ DFTcore(adjilist,i,vertexStatusArr); } printf("\n"); } void DFTcore(vnode *adjilist,int i,int* vertexStatusArr) { if(vertexStatusArr[i] == 1) return; printf("%d ",i); vertexStatusArr[i] = 1; edgenode *p; for(p=adjilist[i].first;p;p=p->next) { DFTcore(adjilist, p->to, vertexStatusArr); } }
时间复杂度为O(V+E)。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。