最短路径

/********************************************************
--程序描述:	图1-1的最短路径算法
--修改日期:	2009.5.31
--修改人:		吴强
--修改原因:	从前写的程序不够规范
--输入要求:	字母A至J
********************************************************/
#include 
#include 

#define N 5
#define M 10
#define Max 255

typedef 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值