RT。
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
const int M=4e5+10;
struct node1{int x,y,z;}E[M];
struct node2{int x,dis;};
struct node3{int y,z;};
bool cmp(const node1 &x,const node1 &y){return x.z>y.z;}
bool operator <(const node2 &x,const node2 &y){return x.dis>y.dis;}
int T,n,m;
vector<node3> a[N];
vector<int> b[N];
int fd[N],val[N],cnt;
int dis[N];
bool vis[N];
priority_queue<node2> q;
int find(int x){return fd[x]==x?x:fd[x]=find(fd[x]);}
void Kruscal(){
sort(E+1,E+m+1,cmp);cnt=n;
for(int i=1;i<=2*n;i++) fd[i]=i;
for(int i=1;i<=m;i++){
int fx=find(E[i].x),fy=find(E[i].y);
if(fx==fy) continue;
val[++cnt]=E[i].z;fd[fx]=cnt,fd[fy]=cnt;
b[cnt].push_back(fx);
b[cnt].push_back(fy);
if(cnt==2*n-1) break;
}
}
void Dijkstra(){
memset(dis,63,sizeof(dis));
memset(vis,false,sizeof(vis));
while(!q.empty()) q.pop();
dis[1]=0;q.push({1,0});
while(!q.empty()){
int x=q.top().x;q.pop();
if(vis[x])continue;vis[x]=true;
for(int i=0;i<a[x].size();i++){
int y=a[x][i].y,z=a[x][i].z;
if(dis[x]+z<dis[y]){
dis[y]=dis[x]+z;
q.push({y,dis[y]});
}
}
}
}
namespace Latest_Ancestor{
int f[N][30];
int Vl[N];
void dfs(int x,int F){
bool flag=false;
f[x][0]=F;
for(int i=0;i<b[x].size();i++){
int y=b[x][i];
if(y!=F) dfs(y,x),flag=true,Vl[x]=min(Vl[x],Vl[y]);
}if(!flag) Vl[x]=dis[x];
}
void init(){
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
}
int LCA(int x,int p){
for(int i=20;i>=0;i--)
if(val[f[x][i]]>p) x=f[x][i];
return x;
}
}
int main(){
freopen("return3.in","r",stdin);
freopen("out.ans","w",stdout);
using namespace Latest_Ancestor;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z,l;
scanf("%d%d%d%d",&x,&y,&z,&l);
E[i]={x,y,l};
a[x].push_back({y,z});
a[y].push_back({x,z});
}Kruscal();Dijkstra();
memset(Vl,63,sizeof(Vl));
dfs(cnt,0);init();
int q,k,s;scanf("%d%d%d",&q,&k,&s);
int ans=0;
while(q--){
int x,y;scanf("%d%d",&x,&y);
x=(x+k*ans-1)%n+1,y=(y+k*ans)%(s+1);
int pos=LCA(x,y);ans=Vl[pos];
printf("%d\n",ans);
}
for(int i=1;i<=2*n;i++)
while(!a[i].empty())
a[i].pop_back();
for(int i=1;i<=2*n;i++)
while(!b[i].empty())
b[i].pop_back();
}
}
似乎答案中的零,这个程序都会输出一些非零数。