【floyed】导游的魔棒

在这里插入图片描述


思路:

初看此题,n<=50直接用floyed写,我用了三维数组f[i][j][0/1]表示从i到j有没有用减半的最短距离,然后floyed来求最短路就好了,然后变量要开double,因为折半要除以2,会出现0.5的情况


C o d e Code Code:

#include <cstdio>
#include <iostream>
#include <cstring>
#define CWH using
#define AK namespace
#define IOI std
CWH AK IOI;
int n;
double a[100][100],f[100][100][100];//a是图
int main ()
{
//	freopen ("c.in","r",stdin);
//	freopen ("c.out","w",stdout);
	scanf("%d",&n);
	for (int i = 1; i <= n; ++i)
	  for (int j = 1; j <= n; ++j)
	  {
	    scanf("%lf",&a[i][j]);  
		if (a[i][j] == 0) 
		{
          f[i][j][0] = 10010100;
          f[i][j][1] = 10010100;
        }
          else //要不要折半
		{             
          f[i][j][0] = a[i][j];
          f[i][j][1] = a[i][j] / 2;                                          
        }
	  }
	 for (int k = 1; k <= n; ++k)//floyed
	  for (int i = 1; i <= n; ++i)
       for (int j = 1; j <= n; ++j)
         if(i != j && i != k && j != k)
         	{
			  f[i][j][0] = min (f[i][j][0], f[i][k][0] + f[k][j][0]);
              f[i][j][1] = min (f[i][j][1], f[i][k][1] + f[k][j][0]);
              f[i][j][1] = min (f[i][j][1], f[i][k][0] + f[k][j][1]);
			}
         if(f[1][n][1] == 10010100)printf("-1");else        //判断能否到达          
        printf("%.2lf",(double)f[1][n][1]);
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值