题意:
给一个无向图,定义pair(u, v),使得任意k(k != u, v),k到u,v都有边或者k到(u,v)都不存在边
求这样的无序对数目。
思路:
对点u,让它的相邻点集为S(u), 不包括u
对于pair(u, v)
可以分为两类
if (u, v)存在直接相连的边
则 S(u) + u = S(v) + v
else
S(u) = S(v)
所以一个自然的思路就是哈希。。
hash( S(u) ) -> integer x
const LL P = 13331;
LL Pw[N];
void init() {
Pw[0] = 1; rep(i, 1, 1000000) Pw[i] = Pw[i-1] * P;
}
int n, m, edge[N][2];
LL ha[N];
int main() {
#ifdef _LOCA_ENV_
freopen("input.in", "r", stdin);
#endif // _LOCA_ENV
init();
scanf("%d%d", &n, &m);
rep(i, 0, m-1) {
int u, v;
scanf("%d%d", &u, &v);
-- u, -- v;
ha[u] += Pw[v];
ha[v] += Pw[u];
edge[i][0] = u;
edge[i][1] = v;
}
LL ans = 0;
rep(i, 0, m-1) {
int u = edge[i][0], v = edge[i][1];
LL hu = ha[u] + Pw[u], hv = ha[v] + Pw[v];
if ( hu == hv ) ++ ans;
}
sort(ha, ha + n);
int last = 0;
rep(i, 1, n-1)
if ( ha[i] != ha[i-1] ) {
ans += (i - last) * 1ll * (i - last - 1) / 2;
last = i;
}
ans += (n - last) * 1ll * (n - last - 1) / 2;
printf("%I64d", ans);
return 0;
}