The specific solving view Big petition P316
#include <iostream>#include<algorithm>#include<vector>#include<string.h>#include<stack>#include<cstdio>using namespacestd;structedge{intu,v;};Const intMAXN = ++Ten;intPre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;vector<int>G[maxn],bcc[maxn];stack<Edge>S;intDfsintUintFA) { intlowu=pre[u]=++Dfs_clock; intChild=0; for(intI=0; I<g[u].size (); i++){ intv=G[u][i]; Edge e=(Edge) {u,v}; if(!pre[v]) {//V has not been visitedS.push (e); Child++; intlowv=DFS (V,U); Lowu= min (LOWU,LOWV);//update yourself with the low function of the descendant if(lowv>=Pre[u]) {Iscut[u]=true; Bcc_cnt++; Bcc[bcc_cnt].clear (); for(;;) {Edge x=S.top (); S.pop (); if(bccno[x.u]!=bcc_cnt) {Bcc[bcc_cnt].push_back (X.U); BCCNO[X.U]=bcc_cnt; } if(bccno[x.v]!=bcc_cnt) {Bcc[bcc_cnt].push_back (X.V); BCCNO[X.V]=bcc_cnt; } if(X.U==U&&X.V==V) Break; } } } Else if(pre[v]<pre[u]&&v!=FA) {S.push (e); Lowu=min (Lowu,pre[v]);//update yourself with a reverse edge } } if(fa<0&&child==1) iscut[u]=0; returnLowu;}voidFIND_BCC (intN) {memset (PRE,0,sizeof(pre)); memset (Iscut,0,sizeof(Iscut)); memset (Bccno,0,sizeof(BCCNO)); Dfs_clock=bcc_cnt=0; for(intI=0; I<n; i++) if(!pre[i]) DFS (i,-1);}intODD[MAXN],COLOR[MAXN];BOOLBipartite (intUintb) { for(intI=0; I<g[u].size (); ++i) { intv=G[u][i]; if(bccno[v]!=b)Continue; if(Color[u] = = Color[v])return false; if(!Color[v]) {Color[v]=3-Color[u]; if(!bipartite (V,B))return false; } } return true;}intA[MAXN][MAXN];intMain () {intKase=0, N,m; while(SCANF ("%d%d", &n,&m) = =2&&N) { for(intI=0; i<n; i++) g[i].clear (); memset (A,0,sizeof(A)); for(intI=0; i<m; ++i) { intu,v; scanf ("%d%d",&u,&v); U--; v--; A[U][V]=a[v][u]=1; } for(intu=0; u<n; ++u) for(intv=u+1; v<n; ++v)if(!A[u][v]) {G[u].push_back (v); G[v].push_back (U); } FIND_BCC (n); memset (Odd,0,sizeof(odd)); for(intI=1; i<=bcc_cnt; ++i) {memset (color,0,sizeof(color)); for(intj=0; J<bcc[i].size (); ++j) Bccno[bcc[i][j]]=i; intU = bcc[i][0]; Color[u]=1; if(!bipartite (u,i)) for(intj=0; J<bcc[i].size (); ++j) Odd[bcc[i][j]]=1; } intans=N; for(intI=0; i<n; ++i)if(Odd[i]) ans--; printf ("%d\n", ans); } return 0;}
View Code
la3523 Petition example Round Table Knight Double Unicom Component + two-part diagram