读书人

求大神帮助!关于寻路有关问题

发布时间: 2012-03-30 17:32:09 作者: rapoo

求大神帮助!!!关于寻路问题
给定任意n个点,并给定它们之间的距离,求出从结点v到结点u的最短距离,其中结点v和u是n个结点中的任意两点。
要求:1、自己输入总共的点数
2、自己输入2点之间的距离
3、输出最短距离

[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define MVNum 100#define Maxint 32767enum boolean{FALSE,TRUE};typedef char VertexType;typedef int Adjmatrix;typedef struct{    VertexType vexs[MVNum];    Adjmatrix arcs[MVNum][MVNum];}MGraph;int D1[MVNum],P1[MVNum];int D[MVNum][MVNum],P[MVNum][MVNum];void CreateMGraph(MGraph * G,int n,int e){    int i,j,k,w;    for(i=1;i<=n;i++)        G->vexs[i]=(char)i;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            G->arcs[i][j]=Maxint;        printf("输入%d条边的i,j及w:\n",e);        for(k=1;k<=e;k++)        {            scanf("%d,%d,%d",&i,&j,&w);            G->arcs[i][j]=w;        }        printf("有向图的存储结构建立完毕!\n");}void Dijkstra(MGraph *G,int v1,int n){    int D2[MVNum],P2[MVNum];    int v,i,w,min;    enum boolean S[MVNum];    for(v=1;v<=n;v++)    {        S[v]=FALSE;        D2[v]=G->arcs[v1][v];        if(D2[v]<Maxint)            P2[v]=v1;        else            P2[v]=0;    }    D2[v1]=0;S[v1]=TRUE;    for(i=2;i<n;i++)    {        min=Maxint;        for(w=1;w<=n;w++)            if(!S[w] && D2[w]<min)            {                v=w;min=D2[w];            }            S[v]=TRUE;            for(w=1;w<=n;w++)                if(!S[w] && (D2[v]+G->arcs[v][w]<D2[w]))                {                    D2[w]=D2[v]+G->arcs[v][w];                    P2[w]=v;                }    }    printf("路径长度    路径\n");    for(i=1;i<=n;i++){        printf("%5d",D2[i]);        printf("%5d",i);        v=P2[i];        while(v!=0)        {            printf("<-%d",v);            v=P2[v];        }        printf("\n");    }}void Floyd(MGraph *G,int n){    int i,j,k;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        {            if(G->arcs[i][j]!=Maxint)                P[i][j]=j;            else                P[i][j]=0;            D[i][j]=G->arcs[i][j];        }        for(k=1;k<=n;k++)        {            for(i=1;i<=n;i++)                for(j=1;j<=n;j++)                {                    if(D[i][k]+D[k][j]<D[i][j])                    {                        D[i][j]=D[i][k]+D[k][j];                        P[i][j]=P[i][k];                    }                }        }}void main(){    MGraph *G;    int n,e,v,w,k;    int xz=1;    G=(MGraph *)malloc(sizeof(MGraph));    printf("输入图中顶点个数和边数n,e: ");    scanf("%d,%d",&n,&e);    CreateMGraph(G,n,e);    while(xz!=0)    {        printf("******求城市之间的最短路径******\n");        printf("================================\n");        printf("1.求一个城市到所有城市的最短路径\n");        printf("2.求任意的两个城市之间的最短路径\n");        printf("================================\n");        printf("请选择:1 或 2,选择 0 退出:");        scanf("%d",&xz);        if(xz==2)        {            Floyd(G,n);            printf("输入源点(或称起点)和终点:v,w: ");            scanf("%d,%d",&v,&w);            k=P[v][w];            if(k==0)                printf("顶点 %d 到 %d 无路径!\n",v,w);            else            {                printf("从顶点 %d 到 %d 的最短路径是 %d\n",v,w,v);                while(k!=w)                {                    printf("->%d",k);                    k=P[k][w];                }                printf("->%d",w);                printf("路径长度: %d\n",D[v][w]);            }        }        else            if(xz==1)            {                printf("求单源路径,输入源点 v: ");                scanf("%d",&v);                Dijkstra(G,v,n);            }    }    printf("结束求最短路径,再见!\n");} 

读书人网 >C语言

热点推荐