最短路径

来源:互联网 发布:python 2.7升级为3.5 编辑:程序博客网 时间:2024/05/08 20:08
/********************************************************--程序描述:图1-1的最短路径算法--修改日期:2009.5.31--修改人:吴强--修改原因:从前写的程序不够规范--输入要求:字母A至J********************************************************/#include #include #define N 5#define M 10#define Max 255typedef struct {    char node;    int len;    char last;}Node;int tu[N][M]={ {0, 2, Max, Max, Max, 4, Max, Max, 9, Max},              /*压缩10*10的对称矩阵*/               {2, 0, 4, Max, Max, Max, Max, Max, Max, Max},               {Max, 1, 0, 2, Max, 8, Max, Max, Max, Max},               {4, Max, 3, 0, 5, Max, Max, Max, Max, Max},               {Max, 3, 6, Max, 0, 7, 3, 5, Max, Max} };Node nodeArr[M];main(){    char ch;    int i;        int put(int,int);    void sort(char c);    int Seek(char c);    for (i=0; i< M; i++)      /*初始化数组*/    {    nodeArr[i].node='A'+i;    nodeArr[i].len=Max;    nodeArr[i].last='#';    }    printf("input Node: ");      ch=getchar();     /*输入起点*/    while ( ch< 'A' || ch > 'J' )    {       printf("error/ninput Node: ");    ch=getchar();    }                                  sort(ch);    for ( i=0; i< M; i++)    {        printf("%c %d %c /n", nodeArr[i].node, nodeArr[i].len, nodeArr[i].last);      }   }void sort(char c)         /*按到起点距离最短的全部排序*/{    int i;    int j;    int n;    int h;    int k=0;    Node jh;    for ( i=0; i< M; i++ )                /*起点到起点的距离总是0*/    {    if (c==nodeArr[i].node)    {               /*查找原点附值并交换至nodeArr[0]*/            jh=nodeArr[i];            nodeArr[i]=nodeArr[0];            nodeArr[0]=jh;            nodeArr[0].len=0;            nodeArr[0].last='*';            break;    }    }    while(k< M)                      {            n=0;        for (i=0; i< M; i++)        {            n=put(c-'A',i);  /*该点到各点的距离*/            if (n!=0 || n!=Max)            {                  h=Seek('A'+i);                 if (nodeArr[h].len> n+nodeArr[k].len)                {                    nodeArr[h].len=n+nodeArr[k].len;                    nodeArr[h].last=nodeArr[k].node;                }            }        }        j=k+1;        for ( i=j+1; i< M; i++ )/*查找数组中最小的*/        {            if (nodeArr[j].len> nodeArr[i].len)            {                j=i;            }        }        if (nodeArr[k].node!=nodeArr[j].node)        {            jh=nodeArr[k+1];            nodeArr[k+1]=nodeArr[j];            nodeArr[j]=jh;        }        k++;        c=nodeArr[k].node;    }}     int put(int i,int j)                 /*输入下标,在压缩的矩阵中查找各点间距离*/{    if ( i< M/2 )    {        if ( j< M/2 && j< i )        {            return tu[i][j];        }        else if ( j< M/2 )        {    return tu[j][i];        }        else         {    return tu[M-j-1][M-i-1];        }    }    else     {        if (j< i)    {            return tu[M-i-1][M-j-1];    }        else      {            return tu[M-j-1][M-i-1];    }    }}int Seek(char c)              /*在所放各点数据的nodeArr数组中查找指定字母的下标*/{    int i;    for (i=0; i< M; i++)    {        if ( nodeArr[i].node==c )        {            return i;        }    }    return -1;}