不知道为啥挂成了只dij的分数,求大佬看看/kel,悬赏3关注。
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
inline int read(){
int x = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
int T, n, m, u, v, l, a, Q, K, S, lea[400005], nxt[400005], f[400005], val[400005], dis[400005], vis[400005], tot, Nxt[400005], root, dp[400005][25], ans[400005];
struct edge{
int u, v, w, t, lst;
bool operator < (const edge &a) const{
return t > a.t;
}
}d[800005];
struct Kruskal_MST{
int u, v, lst;
}d1[800005];
int cnt, cnt1;
void add(int a, int b, int c, int D){
d[++cnt].u = a, d[cnt].v = b, d[cnt].w = c;
d[cnt].t = D; d[cnt].lst = nxt[a], nxt[a] = cnt;
}
void addt(int a, int b){
d1[++cnt1].u = a, d1[cnt1].v = b;
d1[cnt1].lst = Nxt[a], Nxt[a] = cnt1;
}
void dijkstra(){
memset(dis, 9, sizeof(dis));
memset(vis, 0, sizeof(vis));
priority_queue<pair<int, int>, vector< pair<int, int> >, greater< pair<int, int> > > q;
dis[1] = 0;
q.push(make_pair(dis[1], 1));
while(q.size()){
int x = q.top().second; q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i = nxt[x]; i; i = d[i].lst){
int y = d[i].v, val = d[i].w;
if(dis[y] > dis[x] + val){
dis[y] = dis[x] + val;
q.push(make_pair(dis[y], y));
}
}
}
}
int find(int x){
if(f[x] == x) return f[x];
return f[x] = find(f[x]);
}
void merge(int a, int b, int c){
int fx = find(a), fy = find(b);
if(fx == fy) return ;
int node = ++tot;
root = node;
f[fx] = f[fy] = f[node] = node;
val[node] = c;
lea[a] = lea[b] = 1;
addt(fx, node);
addt(node, fx);
addt(node, fy);
addt(fy, node);
}
void dfs(int x, int fa){
// printf("%d %d\n", x, fa);
for(int i = 1; i <= 20; ++i){
dp[x][i] = dp[dp[x][i-1]][i-1];
}
if(lea[x]){
ans[x] = val[x];
return ;
}
for(int i = Nxt[x]; i; i = d1[i].lst){
int y = d1[i].v;
if(y == fa) continue;
dp[y][0] = x;
dfs(y, x);
// printf("%d %d --\n", y, ans[y]);
ans[x] = min(ans[x], ans[y]);
}
}
int getans(int x, int y){
for(int i = 20; i >= 0; --i){
if(val[dp[x][i]] > y){
x = dp[x][i];
}
}
return x;
}
signed main(){
freopen("return.in", "r", stdin);
freopen("return.out", "w", stdout);
T = read();
while(T--){
n = read(), m = read();
tot = n;
memset(lea, 0, sizeof(lea));
memset(dp, 0, sizeof(dp));
memset(nxt, 0, sizeof(nxt));
memset(Nxt, 0, sizeof(Nxt));
memset(val, 0, sizeof(val));
root = 0;
cnt = cnt1 = 0;
for(int i = 1; i <= m; ++i){
u = read(), v = read();
l = read(), a = read();
add(u, v, l, a);
add(v, u, l, a);
}
Q = read(), K = read(), S = read();
for(int i = 1; i <= n; ++i) f[i] = i;
dijkstra();
for(int i = 1; i <= n; ++i) val[i] = dis[i];
sort(d + 1, d + 1 + m);
for(int i = 1; i <= (m << 1); ++i){
int x = d[i].u, y = d[i].v;
merge(x, y, d[i].t);
}
memset(ans, 18, sizeof(ans));
dfs(root, 0);
ans[0] = min(ans[0], ans[root]);
int lstans = 0;
while(Q--){
int x, y;
x = read(), y = read();
x = (x + K * lstans - 1) % n + 1;
y = (y + K * lstans) % (S + 1);
int _ = getans(x, y);
printf("%lld\n", ans[_]);
lstans = ans[_];
}
}
return 0;
}