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
| #include<bits/stdc++.h> using namespace std;
const int M = 2000, N = 1005; int n, m, f[N][2], vis[N][2]; vector<int> v[N];
int read() { int w = 0; char ch = getchar(); while(ch > '9' || ch < '0') ch = getchar(); while(ch <= '9' && ch >= '0') { w = w * 10 + ch - 48; ch = getchar(); } return w; } int dfs(int u, int j, int fa) { int &ans = f[u][j], sum = 0; if(vis[u][j]) return ans; vis[u][j] = 1; ans = M; for(int i = 0; i < v[u].size(); i++) { int to = v[u][i]; if(to == fa) continue; ans += dfs(to, 1, u); } if(fa != -1 && !j) ans += 1; if(j || fa == -1) { for(int i = 0; i < v[u].size(); i++) { int to = v[u][i]; if(to == fa) continue; sum += dfs(to, 0, u); } if(fa != -1) sum += 1; ans = min(ans, sum); } return ans; }
int main() { int T = read(); while(T--) { memset(f, 0, sizeof f); memset(vis, 0, sizeof vis); n = read(); m = read(); for(int i = 0; i < n; i++) v[i].clear(); for(int i = 1; i <= m; i++) { int u = read(), to = read(); v[u].push-back(to); v[to].push-back(u); } int ans = 0; for(int i = 0; i < n; i++) { if(!vis[i][0]) ans += dfs(i, 0, -1); } printf("%d %d %d\n", ans / M, m - ans % M, ans % M); } return 0; }
|