1 #include<stdio.h> 2 #include<string.h> 3 const int N = 1010; 4 const int M = 3000000; 5 struct Edge { 6 int u, v, next; 7 Edge() {} 8 Edge(int u, int v, int next) : u(u), v(v), next(next) {} 9 }E[M]; 10 int head[N], tot; 11 12 void addEdge(int u, int v) { 13 E[tot] = Edge(u, v, head[u]); 14 head[u] = tot++; 15 E[tot] = Edge(v, u, head[v]); 16 head[v] = tot++; 17 } 18 19 int pre[N], iscut[N], bccno[N], dfs_colock, bcc_cnt, bcc[N][N], bcc_size[N]; 20 Edge S[M]; 21 int ST; 22 23 int color[N]; 24 bool bipartite(int u, int b) { 25 for(int i = head[u]; i != -1; i = E[i].next) { 26 int v = E[i].v; if(bccno[v] != b) continue; 27 if(color[v] == color[u]) return false; 28 if(!color[v]) { 29 color[v] = 3 - color[u]; 30 if(!bipartite(v, b)) return false; 31 } 32 } 33 return true; 34 } 35 36 int min(int a, int b) { return a < b ? a : b; } 37 int dfs(int u, int fa) { 38 int lowu = pre[u] = ++dfs_colock; 39 int child = 0; 40 for(int i = head[u]; i != -1; i = E[i].next) { 41 int v = E[i].v; 42 Edge e = Edge(u, v, -1); 43 if(!pre[v]) { 44 S[++ST] = e; 45 child++; 46 int lowv = dfs(v, u); 47 lowu = min(lowu, lowv); 48 if(lowv >= pre[u]) { 49 iscut[u] = true; 50 bcc_cnt++; bcc_size[bcc_cnt] = 0; 51 while(1) { 52 Edge x = S[ST--]; 53 if(bccno[x.u] != bcc_cnt) { 54 bcc[bcc_cnt][bcc_size[bcc_cnt]++] = x.u; 55 bccno[x.u] = bcc_cnt; 56 } 57 if(bccno[x.v] != bcc_cnt) { 58 bcc[bcc_cnt][bcc_size[bcc_cnt]++] = x.v; 59 bccno[x.v] = bcc_cnt; 60 } 61 if(x.u == u && x.v == v) break; 62 } 63 } 64 } 65 else if(pre[v] < pre[u] && v != fa) { 66 S[++ST] = e; 67 lowu = min(lowu, pre[v]); 68 } 69 } 70 if(fa < 0 && child == 1) iscut[u] = 0; 71 return lowu; 72 } 73 74 void find_bcc(int n) { 75 memset(pre, 0, sizeof(pre)); 76 memset(iscut, 0, sizeof(iscut)); 77 memset(bccno, 0, sizeof(bccno)); 78 dfs_colock = bcc_cnt = 0; 79 for(int i = 0; i < n; ++i) 80 if(!pre[i]) dfs(i, -1); 81 } 82 int A[N][N]; 83 int main() { 84 int kase = 0, n, m; 85 while(scanf("%d%d", &n, &m) && n) { 86 memset(head, -1, sizeof(head)); 87 memset(A, 0, sizeof(A)); 88 for(int i = 0; i < m; ++i) { 89 int u, v; 90 scanf("%d%d", &u, &v); u--; v--; A[u][v] = A[v][u] = 1; 91 } 92 for(int i = 0; i < n; ++i) 93 for(int j = i + 1; j < n; ++j) 94 if(!A[i][j]) addEdge(i, j); 95 find_bcc(n); 96 int odd[N] ={0}; 97 for(int i = 1; i<= bcc_cnt; ++i) { 98 memset(color, 0, sizeof(color)); 99 for(int j = 0; j < bcc_size[i]; ++j) bccno[bcc[i][j]] = i; 100 int u = bcc[i][0]; 101 color[u] = 1; 102 if(!bipartite(u, i)) 103 for(int j = 0; j < bcc_size[i]; ++j) odd[bcc[i][j]] = 1; 104 } 105 int ans = n; 106 for(int i = 0; i < n; ++i) if(odd[i]) ans--; 107 printf("%d\n", ans); 108 } 109 return 0; 110 }
浙公网安备 33010602011771号