图论模板 求割顶/判断二分图

来源:互联网 发布:美利坚联盟国 知乎 编辑:程序博客网 时间:2024/06/07 17:34

二分图(AC)

/*=================================*\|  节点u所在的强连通分量是否为二分图|  Call: bipartite(u);\*=================================*/int color[maxn];bool bipartite(int u){    for (int i=head[u];i!=-1;i=edges[i].next)    {        int v=edges[i].to;        if (color[v]&&color[v]==color[u]) return false;        if (!color[v])        {            color[v]=3-color[u];            if (!bipartite(v)) return false;        }    }    return true;}


-------------

/*=================================*\|  dfs求无向连通图割顶|  Init: G[]存无向图的边;vertex:1~n;|  Call: cut_vertex();\*=================================*/const int maxn=1111;vector<int>G[maxn];int pre[maxn],low[maxn];bool iscut[maxn];int dfs_clock;int cut_dfs(int u,int fa){    int lowu=pre[u]=++dfs_clock;    int child=0;    int sz=G[u].size();    for (int i=0;i<sz;i++)    {        int v=G[u][i];        if (!pre[v])        {            child++;            int lowv=cut_dfs(v,u);            lowu=min(lowu,lowv);            if (lowv>=pre[u])            {                iscut[u]=true;            }        }        else if (pre[v]<pre[u]&&v!=fa)        {            lowu=min(lowu,pre[v]);        }    }    if (fa<0&&child==1) iscut[u]=false;    low[u]=lowu;    return lowu;}void cut_vertex(){    memset(pre,0,sizeof(pre));    memset(low,0,sizeof(low));    memset(iscut,0,sizeof(iscut));    dfs_clock=0;    cut_dfs(1,-1);}



/*=================================*\|  节点u所在的强连通分量是否为二分图|  Init: G[]存无向图的边;vertex:1~n;|  Call: bipartite(u);\*=================================*/int color[maxn];bool bipartite(int u){    int sz=G[u].size();    for (int i=0;i<sz;i++)    {        int v=G[u][i];        if (color[v]==color[u]) return false;        if (!color[v])        {            color[v]=3-color[u];            if (!bipartite(v)) return false;        }    }    return true;}





原创粉丝点击