题意简述
N<=1000个点,M<=1000000条边。一条路径的权定义为:所有边权的积。请你求出最短路的边权9987(先最短,再膜)
思路
把边权改为 l n ln ln边权,然后就珂以将乘法变为加法了。但是这样你会WA最后一个点,因为乘的太多爆double了。解决方案是,
- 正解: 每个点记录从哪个点转移过来的,即记录路径。然后用整数运算,边乘边膜,求得答案。
- 非正解:这样的数据只有一个点,下载数据发现答案是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