有向图转换遍历拓扑最短路径.docx
- 文档编号:3515377
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:11
- 大小:17.74KB
有向图转换遍历拓扑最短路径.docx
《有向图转换遍历拓扑最短路径.docx》由会员分享,可在线阅读,更多相关《有向图转换遍历拓扑最短路径.docx(11页珍藏版)》请在冰豆网上搜索。
有向图转换遍历拓扑最短路径
#include
#include
#include
#defineMaxStr20
typedefintStatus;
typedefintElemType;
typedefstruct{
ElemTypeVNode;
intindgree;
}VexType;
typedefstructArc{
VexTypeAdj;
unsignedintWeight;
structArc*NextArc;
}ArcType;
typedefstruct{
VexType*Vex;
ArcType**FirstArc; //邻接表;
// ArcType**InvertArc; //逆邻接表;
intVexNums; //顶点总数;
}DLGraph; //图的邻接表结构定义;
typedefstruct{
ElemType*Vex;
unsignedint**Arc;
intVexNums;
}DMGraph; //图的邻接矩阵结构定义;
//========================================================================================
StatusCreateDMGraph(DMGraph*DMG); //创建图的邻接矩阵;
StatusDMG_Traver(DMGraphDMG); //邻接矩阵的遍历;
StatusDMG_DFS(DMGraphDMG,intv,int*Visited); //邻接矩阵深度遍历(递 归);
StatusDMG_DFS_Uni(DMGraphDMG,intv,int*Visited); //邻接矩阵深度遍历(非递归);
StatusDMG_BFS(DMGraphDMG,intv,int*Visited); //邻接矩阵广度遍历;
StatusDMG2DLG(DMGraphDMG,DLGraph*DLG); //邻接矩阵转换为邻接表;
StatusDLG_Traver(DLGraphDLG); //邻接表的遍历;
StatusDLG_DFS(DLGraphDLG,intv,int*Visited); //邻接表深度遍历(递 归);
StatusDLG_DFS_Uni(DLGraphDLG,intv,int*Visited); //邻接表深度遍历(非递归);
StatusDLG_BFS(DLGraphDLG,intv,int*Visited); //邻接表广度遍历;
//---------------------------------------------------------
StatusTopsort(DLGraphDLG,ElemType**ts); //邻接表有向图的Topsort;
StatusDijkstra(DMGraphDMG,ElemTypev,unsignedint*dist);//Dijkstra;
StatusPRN_DK(DMGraphDMG,unsignedint***dis); //输出Dijkstra算法;
StatusFloyd(DMGraphDMG,unsignedint***flyd); //Floyd;
StatusPRN_DMGraph(DMGraphDMG); //输出邻接矩阵;
StatusPRN_DLGraph(DLGraphDLG); //输出邻接表;
//========================================================================================
intmain(void)
{
inti,j;
DMGraphDMG;
DLGraphDLG;
ElemType*ts;
unsignedint**dist,**flyd;
printf( "一、创立有向图的邻接矩阵:
\n");
CreateDMGraph(&DMG);
PRN_DMGraph(DMG);
printf("\n\n二、有向图-邻接矩阵的遍历:
\n");
DMG_Traver(DMG);
printf("\n\n三、邻接矩阵转换为邻接表:
\n");
DMG2DLG(DMG,&DLG);
PRN_DLGraph(DLG);
printf("\n\n四、有向图-邻接表的遍历:
\n");
DLG_Traver(DLG);
printf("\n\n五、邻接表有向图的拓扑排序:
\n");
Topsort(DLG,&ts);
printf("\n\n\n");system("pause");
printf("\n\n六、邻接矩阵有向图的各点最短路径:
\n\n 1.Dijkstra(迪杰斯特拉算法):
");
PRN_DK(DMG,&dist);
printf("\n\n\n 2.Floyd(弗洛伊德算法):
");
Floyd(DMG,&flyd);
printf("\n"); system("pause");
printf("\n\n\nDijkstra最短路径测试输出:
\n某两点:
最短路径");
for(i=1;i<=DMG.VexNums;i++)
for(j=1;j<=DMG.VexNums;j++)
if(dist[i][j] %5d",i,j,dist[i][j]); printf("\n\nFloyd最短路径测试输出: \n某两点: 最短路径"); for(i=1;i<=DMG.VexNums;i++) for(j=1;j<=DMG.VexNums;j++) if(flyd[i][j] %5d",i,j,flyd[i][j]); printf("\n"); system("pause"); return0; } // 文件格式参见"无向图"说明: //http: //bbs.bc- StatusCreateDMGraph(DMGraph*DMG) //创建图的邻接矩阵; { charReadFileName[MaxStr]; unsignedintw; FILE*fp; inti,j; do{ printf("\n 输入文本文件名: "); gets(ReadFileName); }while(ReadFileName[0]=='\0'||! (fp=fopen(ReadFileName,"r"))); fscanf(fp,"%d",&DMG->VexNums); //得到顶点总数; if(! (DMG->Vex=(ElemType*)malloc((DMG->VexNums+1)*sizeof(ElemType)))) {printf("\n内存溢出。 ");return1;} if(! (DMG->Arc=(unsignedint**)malloc((DMG->VexNums+1)*sizeof(unsignedint*)))) {printf("\n内存溢出。 ");return1;} for(i=1;i<=DMG->VexNums;i++) //邻接矩阵初始化; { DMG->Vex[i]=i; // if(! (DMG->Arc[i]=(unsignedint*)malloc((DMG->VexNums+1)*sizeof(unsignedint)))) {printf("\n内存溢出。 ");return1;} for(j=1;j<=DMG->VexNums;j++) { DMG->Arc[i][j]=INT_MAX; } } while(fscanf(fp,"%d%d%u",&i,&j,&w)==3) DMG->Arc[i][j]=w;// fclose(fp); return0; } //======================================================================================== StatusDMG2DLG(DMGraphDMG,DLGraph*DLG) //图的邻接矩阵转换为邻接表; { inti,j; ArcType*p=NULL; DLG->VexNums=DMG.VexNums; if(! (DLG->Vex=(VexType*)malloc((DLG->VexNums+1)*sizeof(VexType)))) {printf("\n内存溢出。 ");return1;} if(! (DLG->FirstArc=(ArcType**)malloc((DLG->VexNums+1)*sizeof(ArcType*)))) {printf("\n内存溢出。 ");return1;} for(i=1;i<=DLG->VexNums;i++) { DLG->Vex[i].VNode=DMG.Vex[i]; // DLG->FirstArc[i]=NULL; DLG->Vex[i].indgree=0; for(j=1;j<=DMG.VexNums;j++) { if(DMG.Arc[i][j] { if(! (p=(ArcType*)malloc(sizeof(ArcType)))) {printf("\n内存溢出。 ");return1;} p->Adj.VNode=DMG.Vex[j]; p->Weight=DMG.Arc[i][j]; p->NextArc=DLG->FirstArc[i]; DLG->FirstArc[i]=p; } } for(j=1;j<=DMG.VexNums;j++) { if(DMG.Arc[j][i] } } return0; } //======================================================================================== StatusDMG_Traver(DMGraphDMG) //邻接矩阵的遍历; { inti,*Visited; if(! (Visited=(int*)malloc((DMG.VexNums+1)*sizeof(int)))) {printf("\n内存溢出。 ");return1;} printf("\n 1.图的深度遍历: \n递 归: "); for(i=1;i<=DMG.VexNums;i++) Visited[i]=0; for(i=1;i<=DMG.VexNums;i++) if(Visited[i]==0) DMG_DFS(DMG,i,Visited); printf("\n非递归: "); for(i=1;i<=DMG.VexNums;i++) Visited[i]=0; for(i=1;i<=DMG.VexNums;i++) if(Visited[i]==0) DMG_DFS_Uni(DMG,i,Visited); printf("\n\n 2.图的广度遍历: \n\t"); for(i=1;i<=DMG.VexNums;i++) Visited[i]=0; for(i=1;i<=DMG.VexNums;i++) if(Visited[i]==0) DMG_BFS(DMG,i,Visited); return0; } //======================================================================================== StatusDLG_Traver(DLGraphDLG) //邻接表的遍历; { inti,*Visited; if(! (Visited=(int*)malloc((DLG.VexNums+1)*sizeof(int)))) {printf("\n内存溢出。 ");return1;} printf("\n 1.图的深度遍历: \n递 归: "); for(i=1;i<=DLG.VexNums;i++) Visited[i]=0; for(i=1;i<=DLG.VexNums;i++) if(Visited[i]==0) DLG_DFS(DLG,i,Visited); printf("\n非递归: "); for(i=1;i<=DLG.VexNums;i++) Visited[i]=0; for(i=1;i<=DLG.VexNums;i++) if(Visited[i]==0) DLG_DFS_Uni(DLG,i,Visited); printf("\n\n 2.图的广度遍历: \n\t"); for(i=1;i<=DLG.VexNums;i++) Visited[i]=0; for(i=1;i<=DLG.VexNums;i++) if(Visited[i]==0) DLG_BFS(DLG,i,Visited); printf("\n"); return0; } //======================================================================================== StatusDMG_DFS(DMGraphDMG,intv,int*Visited) //邻接矩阵深度遍历(递 归); { inti; Visited[v]=1; printf("%2d->",v); for(i=1;i<=DMG.VexNums;i++) if(Visited[i]==0&&DMG.Arc[v][i] DMG_DFS(DMG,i,Visited); return0; } //======================================================================================== StatusDLG_DFS(DLGraphDLG,intv,int*Visited) //邻接表深度遍历(递 归); { ArcType*p=NULL; Visited[v]=1; printf("%2d->",v); p=DLG.FirstArc[v]; while(p! =NULL) { if(Visited[p->Adj.VNode]==0) DLG_DFS(DLG,p->Adj.VNode,Visited); p=p->NextArc; } return0; } //======================================================================================== StatusDMG_DFS_Uni(DMGraphDMG,intv,int*Visited) //邻接矩阵深度遍历(非递归); { inti,*Stack,top=-1; if(! (Stack=(int*)malloc((DMG.VexNums+1)*sizeof(int)))) {printf("\n内存溢出。 ");return1;} Visited[v]=1; printf("%2d->",v); Stack[++top]=v; while(top! =-1) { for(i=1;i<=DMG.VexNums;i++) if(Visited[i]==0&&DMG.Arc[Stack[top]][i] { Visited[i]=1; printf("%2d->",i); Stack[++top]=i; break; } if(i==DMG.VexNums+1) --top; } return0; } //======================================================================================== StatusDLG_DFS_Uni(DLGraphDLG,intv,int*Visited) //邻接表深度遍历(非递归); { int*Stack,top=-1; ArcType*p=NULL; if(! (Stack=(int*)malloc((DLG.VexNums+1)*sizeof(int)))) {printf("\n内存溢出。 ");return1;} Visited[v]=1; printf("%2d->",v); Stack[++top]=v; while(top! =-1) { p=DLG.FirstArc[Stack[top]]; while(p! =NULL) { if(Visited[p->Adj.VNode]==0) { Visited[p->Adj.VNode]=1; printf("%2d->",p->Adj.VNode); Stack[++top]=p->Adj.VNode; break; } p=p->NextArc; } if(p==NULL) --top; } return0; } //======================================================================================== StatusDMG_BFS(DMGraphDMG,intv,int*Visited) //邻接矩阵广度遍历; { inti,*Queue,rear,front; if(! (Queue=(int*)malloc((DMG.VexNums+1)*sizeof(int)))) {printf("\n内存溢出。 ");return1;} Visi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 转换 遍历 拓扑 路径
![提示](https://static.bdocx.com/images/bang_tan.gif)