poj 2942 点双连通分量+二分图染色

代码丑陋,勿喷。

#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e3+5;
int n,m,f[maxn],low[maxn],pre[maxn],num,ans[maxn][maxn],r,k,color[maxn],ok[maxn],mappp[maxn];
bool edge[maxn][maxn],flag;
typedef struct{int from,to;} bian;
stack s;
void init()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j)
               edge[i][j]=true;
    memset(f,0,sizeof(f));
    while(s.size())
        s.pop();
    num=r=k=0;
    memset(pre,-1,sizeof(pre));
    memset(ans,-1,sizeof(ans));
    memset(color,0,sizeof(color));
    memset(ok,0,sizeof(ok));
    memset(mappp,0,sizeof(mappp));
    flag=false;
}
void dfs(int v,int fa)
{
	bian tpppp;
	tpppp.from=fa;
	tpppp.to=v;
    s.push(tpppp);
    pre[v]=low[v]=num++;
    for(int i=1;i<=n;i++)
    {
        if(edge[v][i]&&i!=fa)
        {
            if(pre[i]==-1)
            {
                dfs(i,v);
                low[v]=min(low[i],low[v]);
                if(low[i]>=pre[v])
                {
                    memset(mappp,0,sizeof(mappp));
                    k=0;
                    bian tpp=s.top();
                    do
                    {
						tpp=s.top();
                        if(tpp.from!=-1&&!mappp[tpp.from])
                        {
                            ans[r][k++]=tpp.from;
                            mappp[tpp.from]=1;
                        }
                        if(!mappp[tpp.to])
                        {
                            ans[r][k++]=tpp.to;
                            mappp[tpp.to]=1;
                        }
                        s.pop();
                    }while(tpp.from!=v&&tpp.from!=-1);
                    ans[r][k]=-1;
                    r++;
                }
            }
            else if(pre[i]

你可能感兴趣的:(poj 2942 点双连通分量+二分图染色)