defget_num(): data = sys.stdin.buffer.read() num = 0 found = False for c in data: if48 <= c <= 57: num = num * 10 + c - 48 found = True else: yield num num = 0 found = False if found: yield num data = get_num() n = next(data) m = next(data) ...
这个方法,不如
1 2 3 4
data = sys.stdin.buffer.read().split() n, m = int(data[0]), int(data[1]) ptr = 2 ...
但 split() 会造成内存的消耗。如果没有超内存就好,超了的话,就用下面的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
defget_next_int(): global pos while pos < n_data and data[pos] <= 32: pos += 1 if pos >= n_data: returnNone res = 0 while pos < n_data and data[pos] > 32: res = res * 10 + (data[pos] - 48) pos += 1 return res
data = sys.stdin.buffer.read() n_data = len(data) pos = 0 n, m = get_next_int(), get_next_int() ...
ans = 0 for i inrange(62, -1, -1): mask = ans >> i # ... while q: u = q.popleft() # if u == b... for u, w in edges[u]: ifnot vis[v] and ((w >> i) | mask) == mask: # ... ifnot flag: # 不连通,填 1 ans |= 1 << i
ans = 0 for i inrange(mx_bit_length + 1, -1, -1): # ... mask = ans | (1 << i) flag = False while q: u = q.popleft() # if u == b:... for v, w in edges[u]: if vis[v] != time_stamp and (w & mask) == 0: # ... if flag: ans |= 1 << i # ...
print((ans ^ ((1 << (mx_bit_length + 2)) - 1)) if ans != -1else -1)
defmain(): data = sys.stdin.buffer.read().split() n, m = int(data[0]), int(data[1]) ptr = 2
mx_bit_length = 0 edges = [[] for _ inrange(n + 1)] for _ inrange(m): u, v, w = int(data[ptr]), int(data[ptr + 1]), int(data[ptr + 2]) ptr += 3
if u == v: continue edges[u].append((v, w)) edges[v].append((u, w)) if mx_bit_length < w.bit_length(): mx_bit_length = w.bit_length()
a, b = int(data[-2]), int(data[-1])
vis = [0] * (n + 1) time_stamp = 0 q = deque() ans = 0 for i inrange(mx_bit_length + 1, -1, -1): time_stamp += 1 vis[a] = time_stamp q.clear() q.append(a) mask = ans | (1 << i) flag = False while q: u = q.popleft() if u == b: flag = True break for v, w in edges[u]: if vis[v] != time_stamp and (w & mask) == 0: q.append(v) vis[v] = time_stamp if flag: ans |= 1 << i elif i == mx_bit_length + 1: ans = -1 break
print((ans ^ ((1 << (mx_bit_length + 2)) - 1)) if ans != -1else -1)
int n, m; cin >> n >> m; vector<vector<edge>> edges(n + 1); while (m--) { int u, v; cin >> u >> v; longlong w; cin >> w; if (u == v) continue; edges[u].push_back({v, w}); edges[v].push_back({u, w}); }
// 没有变快 for (int i = 1; i < edges.size(); i++) { auto &e = edges[i]; sort(e.begin(), e.end()); e.erase(unique(e.begin(), e.end()), e.end()); }
int a, b; cin >> a >> b;
vector<bool> vis(n + 1);
longlong ans = 0; for (int i = 62; i >= 0; i--) { longlong mask = ans >> i; bool flag = false; fill(vis.begin(), vis.end(), false); vis[a] = true; deque<int> q; q.push_back(a); while (!q.empty()) { int u = q.front(); if (u == b) { flag = true; break; } q.pop_front(); for (edge &e : edges[u]) { int v = e.to; longlong w = e.wt; if (!vis[v] && ((w >> i) | mask) == mask) { vis[v] = true; q.push_back(v); } } } if (!flag) { if (i == 62) { ans = -1; break; } ans |= 1LL << i; } } cout << ans; return0; }