标签:ssi ret attr eal min contains ram set order
Description
Input
Output
Sample Input
5 5 1 4 1 5 2 5 3 4 4 5 0 0
Sample Output
2
Hint
Source
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; const int maxn = 1e3+10; const int maxm = 1e6+10; int n,m,low[maxn],dfn[maxn],bcc_cnt,size,bccno[maxn],tim,p,color[maxn],head[maxn]; bool odd[maxn],link[maxn][maxn]; struct edge{ int v,nex; }e[maxm<<1]; struct node{ int u,v; }s[10010]; void adde(int u,int v){ e[size].v=v;e[size].nex=head[u];head[u]=size++; } vector<int> bcc[maxn]; void dfs(int u,int fa){ low[u]=dfn[u]=++tim; for(int i=head[u];~i;i=e[i].nex){ int v=e[i].v; if(!dfn[v]){ s[++p].u=u;s[p].v=v; dfs(v,u); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { ++bcc_cnt; bcc[bcc_cnt].clear(); while(p){ if(bccno[s[p].u]!=bcc_cnt) bcc[bcc_cnt].push_back(s[p].u),bccno[s[p].u]=bcc_cnt; if(bccno[s[p].v]!=bcc_cnt) bcc[bcc_cnt].push_back(s[p].v),bccno[s[p].v]=bcc_cnt; if(s[p].u==u&&s[p].v==v) break; p--; } p--; } }else if(dfn[v]<dfn[u]&&v!=fa){ s[++p].u=u;s[p].v=v; low[u]=min(low[u],dfn[v]); } } } void find_bcc(){ memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(bccno,0,sizeof(bccno));//没加wa了好久 tim=bcc_cnt=0; for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i,-1); } bool half(int u,int d){ for(int i=head[u];~i;i=e[i].nex){ int v=e[i].v; if(bccno[v]!=d) continue; if(color[u]==color[v]) return 0; if(!color[v]) { color[v]=3-color[u]; if(!half(v,d)) return 0; } } return 1; } int main(){ while(scanf("%d%d",&n,&m)&&n){ p=0; size=0; memset(head,-1,sizeof(head)); memset(link,0,sizeof(link)); for(int i=1;i<=m;i++){ int u,v;scanf("%d%d",&u,&v);link[u][v]=link[v][u]=1; } for(int u=1;u<=n;u++) for(int v=1;v<u;v++){ if(link[u][v]) continue;adde(u,v);adde(v,u); } find_bcc(); memset(odd,0,sizeof(odd)); for(int i=1;i<=bcc_cnt;i++){ memset(color,0,sizeof(color)); for(int j=0;j<bcc[i].size();j++) bccno[bcc[i][j]]=i; color[bcc[i][0]]=1; if(!half(bcc[i][0],i)) for(int j=0;j<bcc[i].size();j++) odd[bcc[i][j]]=1; } int ans=n; for(int i=1;i<=n;i++) if(odd[i]) ans--; printf("%d\n",ans); } return 0; }
标签:ssi ret attr eal min contains ram set order
原文地址:https://www.cnblogs.com/plysc/p/11447315.html