1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #include <bits/stdc++.h> using namespace std; const int N = 3000 + 10; const int inf = 0x7fffffff; struct Edge { int ne, e; } edge[N << 1], rdge[N << 1]; int h[N], num_edge = 1; inline void add_edge(int f, int e) { edge[++num_edge].ne = h[f]; edge[num_edge].e = e; h[f] = num_edge; } int rh[N], num_rdge = 1; inline void add_rdge(int f, int e) { swap(f, e); rdge[++num_rdge].ne = rh[f]; rdge[num_rdge].e = e; rh[f] = num_rdge; } int n, m, sc, tot; bool vis[N]; vector<int> g; void rfs(int u, int fa) { int v; if (vis[u]) return; vis[u] = 1; g.push_back(u); for (int i = rh[u]; i; i = rdge[i].ne) { v = rdge[i].e; if (v == fa) continue; rfs(v, u); } return; } void dfs(int u, int fa) { int v; if (vis[u]) return; tot++; vis[u] = 1; for (int i = h[u]; i; i = edge[i].ne) { v = edge[i].e; if (v == fa) continue; dfs(v, u); } return; } int T, x, y, z; int main() { scanf("%d", &T); while (T--) { long long ans = 0; scanf("%d%d", &n, &m); memset(h, 0, sizeof(h)); memset(rh, 0, sizeof(rh)); num_edge = num_rdge = 1; for (int i = 1; i <= m; i++) { scanf("%d%d", &x, &y); add_edge(x, y); add_rdge(x, y); } for (int i = 1; i <= n; i++) { memset(vis, 0, sizeof vis); g.clear(); rfs(i, 0); memset(vis, 0, sizeof vis); for (int j = 0; j < g.size(); j++) { tot = 0; dfs(g[j], 0); ans += tot; } } printf("%lld\n", ans); } return 0; }
|