洛谷 2384 最短路 题解

题意简述

N<=1000个点,M<=1000000条边。一条路径的权定义为:所有边权的积。请你求出最短路的边权9987(先最短,再膜)

思路

把边权改为 l n ln ln边权,然后就珂以将乘法变为加法了。但是这样你会WA最后一个点,因为乘的太多爆double了。解决方案是,

  1. 正解: 每个点记录从哪个点转移过来的,即记录路径。然后用整数运算,边乘边膜,求得答案。
  2. 非正解:这样的数据只有一个点,下载数据发现答案是3922。面向数据编程即珂。

代码

//非正解的,正解写不动了
#include <bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet
{
   
    #define real double
    #define N 1333
    #define E 2.71828182845904523536028747135
    #define F(i,l,r) for(int i=l;i<=r;++i)
    #define D(i,r,l) for(int i=r;i>=l;--i)
    #define Fs(i,l,r,c) for(int i=l;i<=r;c)
    #define Ds(i,r,l,c) for(int i=r;i>=l;c)
    #define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
    #define MEM(x,a) memset(x,a,sizeof(x))
    #define FK(x) MEM(x,0)

    class Graph
    {
   
        public:
            int head[N];
            int EdgeCount;
            struct Edge
            {
   
                int To;real Label;int Next;
            }Ed[N*N<<1];
            void clear(int _V=N,int _E=N<<1) 
            {
   
                memset(Ed,-1,sizeof(Edge)*(_E));
                memset(head,-1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值