rt,调了好久了,我要破防了,谢谢。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int t;
int n,m,h;
int l[N],s[N],f[N],vis[N];
struct ccf
{
int to,x,y;
};
struct road
{
int x,y;
bool operator < (const road &a) const
{
return x>a.x;
}
};
vector<ccf>r[N];
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
d=a,x=1,y=0;
return ;
}
exgcd(b,a%b,d,x,y);
int tmp=x;
x=y,y=tmp-(a/b)*y;
}
int dijkstra()
{
for(int i=1;i<=n;i++)
f[i]=1e18,vis[i]=0;
f[1]=0;
priority_queue<road>q;
q.push({1,0});
while(!q.empty())
{
int x=q.top().x;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(auto i:r[x])
{
int k=0;
if(f[x]<=i.x)k=i.x+1;
else k=i.x+((f[x]-i.x-1)/i.y+1)*i.y+1;
if(f[i.to]<=k)continue;
f[i.to]=k,q.push({i.to,k});
}
}
return f[n]==1e18?-1:f[n];
}
signed main()
{
cin>>t;
while(t--)
{
scanf("%lld%lld%lld",&n,&m,&h);
for(int i=1;i<=n;i++)
scanf("%lld",&l[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&s[i]);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
int a=h,x=0,b=s[u]-s[v],y=0,c=l[v]-l[u],d=0;
if(b<0)b=-b,c=-c;
exgcd(a,b,d,x,y);
if(c%d!=0)continue;
x*=c/d,y*=c/d;
if(y>0)y%=a/d;
else if(y%(a/d)==0)y=0;
else y+=(a/d)*(-y/(a/d)+1);
int k=abs(s[u]-s[v]);
k=h/__gcd(k,h);
r[u].push_back({v,y,k});
r[v].push_back({u,y,k});
// cout<<"r:"<<u<<' '<<v<<' '<<y<<' '<<k<<endl;
}
printf("%lld\n",dijkstra());
for(int i=1;i<=n;i++)
r[i].clear();
}
return 0;
}