WA 了几个点,用并查集写,应该不难看懂。
#include <iostream>
#define int long long
#define pr pair <int, int>
using namespace std;
const int N = 2e5 + 10;
int n, q, f[N], add[N], mor[N], val[N]; bool unu[N];
int rd() {
int res = 0; bool f = 0; char ch = getchar();
while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9') res = (res << 1) + (res << 3) + (ch ^ 48), ch = getchar();
return f ? -res : res;
}
pr get_fa(int x) {
if (x == f[x]) return make_pair(x, 0);
pr tmp = get_fa(f[x]); f[x] = tmp.first, mor[x] += tmp.second;
return make_pair(f[x], mor[x]);
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
n = rd(), q = rd();
for (int i = 1; i <= n; ++ i) f[i] = i, unu[i] = true;
for (int i = 1; i <= q; ++ i) {
int v = rd(), u = rd(), w = rd(); pr fx = get_fa(u), fy = get_fa(v); bool flag = true;
int fu = fx.first, mu = fx.second, fv = fy.first, mv = fy.second;
if (u == v) {
if (! w) cout << i << ' ';
continue;
}
if (unu[u]) f[u] = v, val[u] = val[v] + mv + add[fv] - w;
else if (unu[v]) f[v] = u, val[v] = val[u] + mu + add[fu] + w;
else if (val[u] + mu + add[fu] + w != val[v] + mv + add[fv]) {
if (fu == fv) flag = false;
else add[fv] = val[u] + mu + add[fu] + w - val[v] - mv, mor[fv] += add[fv], f[fv] = fu;
}
unu[u] = unu[v] = false;
if (flag) cout << i << ' ';
}
return 0;
}