1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 1100; int n, m; bool mp[N][N]; vector<int> G[N]; int tsp, cnt, dfn[N], low[N], vdcc[N], sta[N], top; int col[N], v[N]; bool dfs(int x) { for (int y : G[x]) { if (vdcc[y] == cnt) { if (col[y] == -1) { col[y] = col[x] ^ 1; if (dfs(y)) return true; } else if (col[x] == col[y]) return true; } } return false; } void tarjan(int x) { dfn[x] = low[x] = ++tsp; sta[++top] = x; for (int y : G[x]) { if (dfn[y] == 0) { tarjan(y); low[x] = min(low[x], low[y]); if (dfn[x] == low[y]) { cnt++; int l = top; do { col[sta[top]] = -1; vdcc[sta[top]] = cnt; } while (sta[top--] != y); vdcc[x] = cnt; col[x] = 0; if (dfs(x)) { for (int i = top + 1; i <= l; i++) v[sta[i]] = true; v[x] = true; } } } else { low[x] = min(low[x], dfn[y]); } } } int main() { while (scanf("%d%d", &n, &m) != EOF) { if (n == 0 && m == 0) break; memset(mp, true, sizeof(mp)); for (int i = 1; i <= n; i++) mp[i][i] = false; for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); mp[x][y] = mp[y][x] = false; } memset(G, 0, sizeof(G)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (mp[i][j]) G[i].push_back(j); } } tsp = top = cnt = 0; memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(vdcc, 0, sizeof(vdcc)); memset(v, false, sizeof(v)); for (int i = 1; i <= n; i++) { if (dfn[i] == 0) tarjan(i); } int ans = 0; for (int i = 1; i <= n; i++) { if (!v[i]) ans++; } printf("%d\n", ans); } return 0; }
- 1
信息
- ID
- 1453
- 时间
- 2000ms
- 内存
- 64MiB
- 难度
- 8
- 标签
- 递交数
- 116
- 已通过
- 20
- 上传者