社区讨论

为什么数组开大一点才能AC呢

P5651基础最短路练习题参与者 5已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj1vla0
此快照首次捕获于
2025/11/03 19:22
4 个月前
此快照最后确认于
2025/11/03 19:22
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 500005
int n, m, tot, qus;
int nxt[MAXN], val[MAXN];
int to[MAXN], hd[MAXN];
int cnt, dis[MAXN];
bool vis[MAXN];
void add (int u, int v, int w) {
	++ cnt;
	to[cnt] = v;
	val[cnt] = w;
	nxt[cnt] = hd[u];
	hd[u] = cnt;
}
struct node {
	int v; int w;
	friend bool operator < (node a, node b) {
		return a.w > b.w;
	}
}tmp;
void init() {
	memset(dis, 0x7f7f7f7f, sizeof dis);
	memset(vis, 0, sizeof vis);
}
priority_queue<node> q;
void Dij() {
	init();
	dis[1] = 0;
	tmp.v = 1; tmp.w = 0;
	q.push(tmp);
	while (q.size()) {
		node tmp2 = q.top(); q.pop();
		int x = tmp2.v;
		if (vis[x]) continue;
		vis[x] = 1;
		for (int i = hd[x]; i; i = nxt[i]) {
			int v = to[i], w = val[i];
			if (dis[v] > dis[x] ^ w || tot == m) {
				dis[v] = dis[x] ^ w;
				tmp.v = v; tmp.w = dis[v];
				q.push(tmp);
			}
		}
	}
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m >> qus;
    for (int i = 1, u, v, w; i <= m; i ++) {
    	cin >> u >> v >> w;
    	add(u, v, w);
    	add(v, u, w);
    	if (w <= 1) tot ++;
	}
	Dij();
	for (int i = 1; i <= qus; i ++) {
		int x, y; cin >> x >> y;
		cout << (dis[x] ^ dis[y]) << '\n';
	}
	return 0;
}
真的不懂了啊 原来的MAXN是100005 可得40pts 改成500005就AC了 玄学!!! (如果在CSP中遇到这种问题 我这个七年级的入怎么办啊)

回复

4 条回复,欢迎继续交流。

正在加载回复...