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; }