有向图转换遍历拓扑最短路径.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]Vex[i].indgree;
}
}
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