仔细想想题目切掉的环和链的限制,就很容易想到这道题解法就只关心那些边长相同的边所能构成的环的数目即可。不知道为什么现场没有人过这个题,可能榜被带歪了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1000003
struct E{
int u, v, d;
bool operator < (E a) const {
return d < a.d;
}
}e[N];
bool val[N];
long long ans;
void cal(int l, int r, int d) {
int u, v, i, cnt = 0;
for (i = l;i <= r;i++) {
u = e[i].u, v = e[i].v;
val[u] ^= 1;
if (val[u]) cnt++;
else cnt--;
val[v] ^= 1;
if (val[v]) cnt++;
else cnt--;
}
for (i = l;i <= r;i++) {
val[e[i].u] ^= 1;
val[e[i].v] ^= 1;
}
ans += 1ll*cnt/2*d;
}
int main() {
int T, n, m, i, j;
memset(val, 0, sizeof(val));
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (i = 0;i < m;i++) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].d);
}
sort(e, e+m);
ans = 0;
int pre = 0;
for (i = 1;i < m;i++) {
if (e[i].d != e[pre].d) {
cal(pre, i-1, e[pre].d);
pre = i;
}
}
cal(pre, m-1, e[m-1].d);
printf("%lld\n", ans);
}
}