求任意两个顶点的最短通路长度

求图1所示的图G中的任意两个顶点的最短通路长度。

 

#include <stdio.h>

int main() 
{
	int e[10][10],p[10][10]={0};
	int k,i,j;
	for(i = 1;i <= 6;i++)
    {
        for(j = 1;j <= 6;j++)
        {
            e[i][j] = 10000;
        }
    }
    /*初始化边的长度*/
	e[1][2] = e[2][1] = 1;
	e[1][4] = e[4][1] = 2;
	e[2][4] = e[4][2] = 4;
	e[2][3] = e[3][2] = 3;
	e[3][4] = e[4][3] = 1;
	e[3][5] = e[5][3] = 2;
	e[3][6] = e[6][3] = 2;
	e[5][6] = e[6][5] = 2;
	e[4][5] = e[5][4] = 3;
	e[1][1]=e[2][2]=e[3][3]=e[4][4]=e[5][5]=e[6][6]=0;
	printf("A0:\n");//初始状态
    for(i = 1;i <= 6;i++)
    {
        for(j = 1;j <= 6;j++)
        {
            if(e[i][j]==10000)
            printf("    #");//#用来表示无穷大
            else
            printf("%5d",e[i][j]);
        }
        printf("\n");
    }
	for(k = 1;k <= 6;k++)
	{
	    for(i = 1;i <= 6;i++)
	    {
	        for(j = 1;j <= 6;j++)
	        {
	            if(i!=j)
	            {
	                if(e[i][j] > e[i][k]+e[k][j])
	                {
	                    e[i][j] = e[i][k]+e[k][j];
	                    p[i][j] = k;
	                }
	            }
	        }
	    }
	    printf("A%d:\n",k);
	    for(i = 1;i <= 6;i++)
	    {
	        for(j = 1;j <= 6;j++)
	        {
	            if(e[i][j]==10000)
                printf("    #");
                else
	            printf("%5d",e[i][j]);
	        }
	        printf("\n");
	    }

	    for(i = 1;i <= 6;i++)
	    {
	        for(j = 1;j <= 6;j++)
	        {
	            if(p[i][j]==k)
	            printf("p[%d %d]=%d\n",i,j,p[i][j]);
	        }
	    }
	    printf("\n");
	}

	return 0;
}
A0:
    0    1    #    2    #    #
    1    0    3    4    #    #
    #    3    0    1    2    2
    2    4    1    0    3    #
    #    #    2    3    0    2
    #    #    2    #    2    0
A1:
    0    1    #    2    #    #
    1    0    3    3    #    #
    #    3    0    1    2    2
    2    3    1    0    3    #
    #    #    2    3    0    2
    #    #    2    #    2    0
p[2 4]=1
p[4 2]=1

A2:
    0    1    4    2    #    #
    1    0    3    3    #    #
    4    3    0    1    2    2
    2    3    1    0    3    #
    #    #    2    3    0    2
    #    #    2    #    2    0
p[1 3]=2
p[3 1]=2

A3:
    0    1    4    2    6    6
    1    0    3    3    5    5
    4    3    0    1    2    2
    2    3    1    0    3    3
    6    5    2    3    0    2
    6    5    2    3    2    0
p[1 5]=3
p[1 6]=3
p[2 5]=3
p[2 6]=3
p[4 6]=3
p[5 1]=3
p[5 2]=3
p[6 1]=3
p[6 2]=3
p[6 4]=3

A4:
    0    1    3    2    5    5
    1    0    3    3    5    5
    3    3    0    1    2    2
    2    3    1    0    3    3
    5    5    2    3    0    2
    5    5    2    3    2    0
p[1 3]=4
p[1 5]=4
p[1 6]=4
p[3 1]=4
p[5 1]=4
p[6 1]=4

A5:
    0    1    3    2    5    5
    1    0    3    3    5    5
    3    3    0    1    2    2
    2    3    1    0    3    3
    5    5    2    3    0    2
    5    5    2    3    2    0

A6:
    0    1    3    2    5    5
    1    0    3    3    5    5
    3    3    0    1    2    2
    2    3    1    0    3    3
    5    5    2    3    0    2
    5    5    2    3    2    0

A6即为最终所求

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值