图的广度优先遍历和深度优先遍历.docx
- 文档编号:4219358
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:9
- 大小:16.26KB
图的广度优先遍历和深度优先遍历.docx
《图的广度优先遍历和深度优先遍历.docx》由会员分享,可在线阅读,更多相关《图的广度优先遍历和深度优先遍历.docx(9页珍藏版)》请在冰豆网上搜索。
图的广度优先遍历和深度优先遍历
#include
创作时间:
二零二一年六月三十日
#include
#include
#defineTrue1
#defineFalse0
#defineError-1
#defineOk1
#defineINFINITY0
#defineMAX_VERTEX_NUM10//最年夜极点数
#defineMAX_EDGE_NUM40//最年夜边数
typedefenum{DG,DN,UDG,UDN}Graphkind;
typedefcharVertexType;//极点数据类型
typedefstructArcCell
{
intadj;//无权图,1或0暗示相邻否;带权图则是权值.
//int*info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];//极点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的以后极点数和弧数.
Graphkindkind;
}MGraph;
typedefstructArcNode
{
intadjvex;
intweight;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode
{
intdata;
ArcNode*firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedefstruct
{
AdjListvertices;
intvexnum,arcnum;
intkind;
}ALGraph;
intLocateVex(MGraphG,VertexTypev1)
{
inti;
for(i=0;i if(G.vexs[i]==v1) returni; return-1; } typedefstructNode { intdata; structNode*next; }LinkQueueNode; typedefstruct { LinkQueueNode*front; LinkQueueNode*rear; }LinkQueue; intInitQueue(LinkQueue*Q) { Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(Q->front! =NULL) { Q->rear=Q->front; Q->front->next=NULL; return(True); } else return(False); } intEnterQueue(LinkQueue*Q,intx) { LinkQueueNode*NewNode; NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(NewNode! =NULL) { NewNode->data=x; NewNode->next=NULL; Q->rear->next=NewNode; Q->rear=NewNode; return(True); } else return(False); } intDeleteQueue(LinkQueue*Q,int*x) { LinkQueueNode*p; if(Q->front==Q->rear) return(False); p=Q->front->next; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; *x=p->data; free(p); return(True); } intIsEmpty(LinkQueue*Q) { if(Q->front==Q->rear) return(True); else return(False); } intvisited[MAX_VERTEX_NUM]; intCreatDN(MGraph&G1,ALGraph&G2) //采纳数组暗示法,构造有向网G { intb; ArcNode*p; VertexTypev1,v2; intw,j; cout<<"输入图的极点数及弧数"< cin>>G1.vexnum>>G1.arcnum; G2.vexnum=G1.vexnum; G2.arcnum=G1.arcnum; cout<<"输入极点向量"< for(inti=0;i { cin>>G1.vexs[i]; } for(i=0;i for(j=0;j { G1.arcs[i][j].adj=INFINITY; } for(i=0;i { G2.vertices[i].data=i; G2.vertices[i].firstarc=NULL; } cout<<"输入边依附的两个极点及此边的权值"< for(intk=0;k { cout<<"pleaseinput: "; cin>>v1>>v2>>w; i=LocateVex(G1,v1); j=LocateVex(G1,v2); G1.arcs[i][j].adj=w; p=(ArcNode*)malloc(sizeof(ArcNode)); b=w; p->adjvex=j; p->weight=b; p->nextarc=G2.vertices[i].firstarc; G2.vertices[i].firstarc=p; } return1; } voiddispMGraph(MGraphG) { cout<<"图的邻接矩阵图是: "< for(inti=0;i { for(intj=0;j cout<<""< cout< } } voidDepth1(MGraphg1,intvo) { intvj; printf("%c",g1.vexs[vo]); visited[vo]=True; for(vj=0;vj if((! visited[vj])&&(! g1.arcs[vo][vj].adj==0)) Depth1(g1,vj); } voidBreadth1(MGraphg1,intvo) { intvi,vj; LinkQueueQ; InitQueue(&Q); visited[vo]=True; EnterQueue(&Q,vo); while(! IsEmpty(&Q)) { DeleteQueue(&Q,&vi); printf("%c",g1.vexs[vi]); for(vj=0;vj if((! visited[vj])&&(! g1.arcs[vi][vj].adj==0)) { visited[vj]=True; EnterQueue(&Q,vj); } } } voidTraverse1(MGraphg1) { intvi; for(vi=0;vi visited[vi]=False; printf("\n深度优先遍历的结果: \n"); for(vi=0;vi { if(! visited[vi]) { Depth1(g1,vi); printf("\n"); } } for(vi=0;vi visited[vi]=False; printf("\n广度优先遍历的结果: \n"); for(vi=0;vi { if(! visited[vi]) { Breadth1(g1,vi); printf("\n"); } } } voidchange1(MGraphG){ cout<<"图的邻接矩阵转化为邻接表如下: "; cout< for(inti=0;i { for(intj=0;j if(G.arcs[i][j].adj! =0){ cout<<"("< } } cout< }} voidchange2(ALGraphG){ inta[MAX_VERTEX_NUM][MAX_VERTEX_NUM];inti,j,m; ArcNode*p; cout<<"图的邻接表转化为邻接矩阵如下: "< for(i=0;i { p=G.vertices[i].firstarc; while(p! =NULL) {m=p->adjvex; a[i][m]=p->weight; p=p->nextarc; }} for(i=0;i for(j=0;j if(a[i][j]>0); elsea[i][j]=0;}} for(i=0;i for(j=0;j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广度 优先 遍历 深度