重构后不是最多2*n-1个节点吗????
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int N = 200010,M = 500010,inf = 2e9 + 10;
typedef pair<int,int> P;
vector<P> v[N];
vector<int> mp[N*2];
int dis[N],n,fa[N*2],sz,f[N*2][22],h[N*2],min_dis[N*2];
struct edge{
int a,b,w;
}e[M];
priority_queue<P,vector<P>,greater<P> >Q;
void get_dis(){
for(int i = 1;i<=n;++i)dis[i] = inf;
dis[1] = 0;
Q.push(P(0,1));
while(!Q.empty()){
auto t = Q.top();
Q.pop();
int d = t.first, s = t.second;
if(dis[s]<d)continue;
for(int i = 0;i<v[s].size();++i){
int to = v[s][i].first,w = v[s][i].second;
if(dis[to]>d+w){
dis[to] = d+w;
Q.push(P(dis[to],to));
}
}
}
}
int find(int n){return fa[n]==n?n:fa[n]=find(fa[n]);}
bool cmp(edge a,edge b){
return a.w>b.w;
}
void dfs(int s){
if(s<=n){
min_dis[s] = dis[s];
return ;
}
for(int i = 0;i<mp[s].size();++i){
dfs(mp[s][i]);
min_dis[s] = min(min_dis[s],min_dis[mp[s][i]]);
}
}
int get_node(int v,int p){
for(int i = 21;i>=0;--i){
if(h[f[v][i]]>p){
v = f[v][i];
}
}
return v;
}
int main(){
//IOS;
//freopen("a.txt","r",stdin);
//freopen("ans.txt","w",stdout);
int T;
cin>>T;
while(T--){
while(!Q.empty())Q.pop();
for(int i = 0;i<N;++i){
v[i].clear();
mp[i].clear();
}
int m;
cin>>n>>m;
sz = n;
for(int i = 1;i<=m;++i){
int x,y,l,a;
cin>>x>>y>>l>>a;
v[x].push_back(P(y,l));
v[y].push_back(P(x,l));
e[i].a = x;
e[i].b = y;
e[i].w = a;
}
get_dis();
sort(e+1,e+1+m,cmp);
for(int i = 0;i<2*N;++i)fa[i] = i,min_dis[i] = inf;
for(int i = 1;i<=m;++i){
int ta = find(e[i].a),tb = find(e[i].b);
if(ta!=tb){
fa[ta] = ++sz;
fa[tb] = sz;
f[ta][0] = sz;
f[tb][0] = sz;
h[sz] = e[i].w;
mp[sz].push_back(ta);
mp[sz].push_back(tb);
}
}
dfs(sz);
for(int j = 1;j<22;++j){
for(int i = 1;i<=sz;++i)f[i][j] = f[f[i][j-1]][j-1];
}
int q,k,s,lastans = 0;
cin>>q>>k>>s;
for(int i = 1;i<=q;++i){
int v,p;
cin>>v>>p;
v = (v+k*lastans-1)%n+1;
p = (p+k*lastans)%(s+1);
v = get_node(v,p);
lastans = min_dis[v];
cout<<min_dis[v]<<endl;
}
}
return 0;
}
好奇???