cf 二分图

题目链接:http://vjudge.net/contest/133033#problem/C

题目大意:给你n个点,m条边,将其分成两个集合,集合A是图的一个点覆盖,集合B也是图的一个点覆盖,要求集合A和集合B没有交集,如果有这样的两个集合,在spj的情况下输出合理解,如果没有这样的分配,输出-1. (看看能不能分成二分图)

思路:用dfs写

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=100005;

vector<int>x[maxn];
vector<int>ans[2];
int visit[maxn];
int type[maxn];
int flag;

void dfs(int A,int p,int t)
{
    visit[A]=1;
    type[A]=t;
    ans[t].push_back(A);
    for(int i=0; i<x[A].size(); i++)
    {
        int v=x[A][i];
        if(v==p) continue;    //时间优化
        if(visit[v] && type[v]==type[A]) flag=1;
        if(visit[v]) continue;
        dfs(v,A,t^1);
    }
}

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        int a,b;
        memset(visit,0,sizeof(visit));
        flag=0;
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&a,&b);
            x[a].push_back(b);
            x[b].push_back(a);
        }
        for(int i=1; i<=n; i++)
            if(!visit[i] && !flag)
                dfs(i,-1,0);
        if(flag==1)
        {
            printf("-1\n");
            continue;
        }
        else
        {
            printf("%d\n",ans[0].size());
            for(int i=0; i<ans[0].size()-1; i++)
                printf("%d ",ans[0][i]);
            printf("%d\n",ans[0][ans[0].size()-1]);
            printf("%d\n",ans[1].size());
            for(int i=0; i<ans[1].size()-1; i++)
                printf("%d ",ans[1][i]);
            printf("%d\n",ans[1][ans[1].size()-1]);
        }
    }
    return 0;
}

 

posted @ 2016-10-18 19:34  a_clown_cz  阅读(189)  评论(0编辑  收藏  举报