它活了,而且一个优化也没加。
代码是朋友的。
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int head[N],vct[N],nxt[N],edge[N],idx;
void add(int x,int y,int w){
vct[++idx]=y;edge[idx]=w;
nxt[idx]=head[x];head[x]=idx;
}
int dis[N];
void dij();
struct node{
int x,y,w,l;
bool operator<(const node p)const{
return w>p.w;
}
}S[N];
int n,m;
int fa[N];
void init(){
for(int i=1;i<=2*n;i++)fa[i]=i;
}
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
int cnt,w[N];
void kruskal(){
init();
sort(S+1,S+1+m);
cnt=n;
for(int i=1;i<=m;i++){
int x=find(S[i].x),y=find(S[i].y);
if(x==y)continue;
fa[x]=++cnt;fa[y]=cnt;
add(cnt,x,0),add(cnt,y,0);
w[cnt]=S[i].w;
}
}
void init_s(){
idx=0;
memset(head,0,sizeof head);
memset(nxt,0,sizeof nxt);
}
int dep[N],fath[N][24];
void dfs(int u){
// cout<<u<<'\n';
for(int i=head[u];i;i=nxt[i]){
int v=vct[i];
dep[v]=dep[u]+1;fath[v][0]=u;
dfs(v);
dis[u]=min(dis[u],dis[v]);
}
}
int lst;
void init_f(){
for(int k=1;k<=20;k++){
for(int i=1;i<=cnt;i++){
fath[i][k]=fath[fath[i][k-1]][k-1];
}
}
}
//0 50 150 200 50 0 0
//0 0 0 0 2 1 1
int query(int x,int ws){
for(int i=20;i>=0;i--)if(w[fath[x][i]]>ws)x=fath[x][i];
return x;
}
void solve(){
cin>>n>>m;
init_s();
for(int i=1;i<=m;i++){
cin>>S[i].x>>S[i].y>>S[i].l>>S[i].w;
add(S[i].x,S[i].y,S[i].l);add(S[i].y,S[i].x,S[i].l);
}
dij();
//UP good
init_s();
kruskal();
dfs(cnt);
init_f();
int q,k,s;
cin>>q>>k>>s;
lst=0;
for(int i=1;i<=q;i++){
int u,v;
cin>>u>>v;
u=(u+k*lst-1)%n+1;
v=(v+k*lst)%(s+1);
// cout<<query(u,v)<<'\n';
cout<<(lst=dis[query(u,v)])<<'\n';
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
// cout<<dis[-1];
int T;
cin>>T;
while(T--)solve();
return 0;
}
#define pi pair<int,int>
void dij(){
memset(dis,0x3f3f3f3f,sizeof dis);
priority_queue<pi>q;
q.push({0,1});dis[1]=0;
while(q.size()){
int u=q.top().second;q.pop();
for(int i=head[u];i;i=nxt[i]){
int v=vct[i];
if(dis[v]>dis[u]+edge[i])dis[v]=dis[u]+edge[i],q.push({-dis[v],v});
}
}
}