求助 kruskal 重构树 WA#7-#20 30pts
查看原帖
求助 kruskal 重构树 WA#7-#20 30pts
357163
shyr楼主2022/9/4 19:48

不知道为啥挂成了只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;
}

2022/9/4 19:48
加载中...