有向图转换遍历拓扑最短路径.docx

上传人:b****4 文档编号:3515377 上传时间:2022-11-23 格式:DOCX 页数:11 大小:17.74KB
下载 相关 举报
有向图转换遍历拓扑最短路径.docx_第1页
第1页 / 共11页
有向图转换遍历拓扑最短路径.docx_第2页
第2页 / 共11页
有向图转换遍历拓扑最短路径.docx_第3页
第3页 / 共11页
有向图转换遍历拓扑最短路径.docx_第4页
第4页 / 共11页
有向图转换遍历拓扑最短路径.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

有向图转换遍历拓扑最短路径.docx

《有向图转换遍历拓扑最短路径.docx》由会员分享,可在线阅读,更多相关《有向图转换遍历拓扑最短路径.docx(11页珍藏版)》请在冰豆网上搜索。

有向图转换遍历拓扑最短路径.docx

有向图转换遍历拓扑最短路径

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1