點雙聯通和二分圖着色(二分圖判定)模板

        #include <iostream>
        #include <cstdio>
        #include <cstring>
        #include <queue>
        #include <algorithm>
        #include <cmath>
        #include <stack>
        #define LL long long
        using namespace std;
        const int maxn=1000+10;
        const int maxm=1000000+10;
        struct node  { int u,v; };
        stack<node> S;
        vector<int> G[maxn];
        int e[maxn][maxn],pre[maxn],is_cut[maxn],bcc_num[maxn],odd[maxn],color[maxn];
        int n,m,tot;
        int dfs_clock;
       int dfs(int u,int fa)
        {
            int lowu,lowv;
            pre[u]=lowu=++dfs_clock;
            int child=0;
            int i,j;
            node tem;
            for(i=1;i<=n;i++)  //
            {
                if(!e[u][i])
                {
                if(!pre[i])
                {
                    S.push(node{u,i});
                    child++;
                    lowv=dfs(i,u);
                    lowu=min(lowu,lowv);
                    if(lowv>=pre[u])
                    {
                        is_cut[u]=1;
                        tot++;
                        G[tot].clear();
                        for(;;)
                        {
                            tem=S.top(); S.pop();
                            if(bcc_num[tem.u]!=tot) { bcc_num[tem.u]=tot; G[tot].push_back(tem.u); }
                            if(bcc_num[tem.v]!=tot) { bcc_num[tem.v]=tot; G[tot].push_back(tem.v);}
                            if(tem.u==u&&tem.v==i) break;
                        }
                    }
                }
                else
                {
                    if(pre[i]<pre[u]&&i!=fa)
                    {
                        S.push(node{u,i});
                        lowu=min(lowu,pre[i]);
                    }
                }
            }
                }
                if(fa<0&&child==1) is_cut[u]=0;
                return lowu;
        }
        void find_BCC()
        {
            memset(pre,0,sizeof(pre));
            memset(bcc_num,0,sizeof(bcc_num));
            dfs_clock=0;
            tot=0;
            int i;
            for(i=1;i<=n;i++) if(!pre[i]) dfs(i,-1);
        }
        int bi_color(int u,int num)
        {
            int v,i;
            for(i=0;i<G[num].size();i++)
            {
                v=G[num][i];
                if(v!=u&&!e[u][v])
                {
                    if(color[u]==color[v]) return 0;
                    if(!color[v])
                    {
                        color[v]=3-color[u];
                        if(!bi_color(v,num)) return 0;
                    }
                }
            }
            return 1;
        }
        int main()
        {
            while(~scanf("%d%d",&n,&m))
            {
                if(!n&&!m) break;
                int i,u,v;
                memset(e,0,sizeof(e));
                for(i=0;i<m;i++)
                {
                    scanf("%d%d",&u,&v);
                    e[u][v]=e[v][u]=1;
                }
                find_BCC();
                memset(odd,0,sizeof(odd));
                int j;
                for(i=1;i<=tot;i++)
                {
                    memset(color,0,sizeof(color));
                    for(j=0;j<G[i].size();j++)
                    {

                        v=G[i][j];
                        bcc_num[v]=i;
                    }
                    color[G[i][0]]=1;
                    if(!bi_color(G[i][0],i))
                        for(j=0;j<G[i].size();j++) odd[G[i][j]]=1;
                }
                int ans=n;
                for(i=1;i<=n;i++) if(odd[i]) ans--;
                printf("%d\n",ans);
            }
            return 0;
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章