#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=;
int g[N][N];
int r[N][N];//模型图
int c[N];// 染的颜色
int num[N][]; int snt; // 联通分量
int s[N]; //每个点所属联通分量
bool dp[N][N];// 前i个联通分量能否组成为J人的一组
int ans[N][N];// 前i个联通分量组成为J人的一组的选择(选择0一组还是1一组)
int n;
bool flag ;
void dfs (int rt) {
for (int i=;i<=n;i++) {
if (r[rt][i]) {
if (c[i]==-) {
c[i]=c[rt]^;
num[snt][c[i]]++;
s[i]=snt;
dfs (i);
if (flag) return ;
}
if (c[i]==c[rt]) {flag=; return;}
}
}
return ;
}
int main ()
{
ios::sync_with_stdio(false);
cin>>n;
for (int i=;i<=n;i++) {
int x;
while (cin>>x&&x) g[i][x]=;
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
if (j!=i&&g[j][i]==)
r[i][j]=r[j][i]=;(//不相互认识的人建立无向边,这两个人一定在不同的分组,(0,1)染色问题)
}
memset (c,-,sizeof (c));
for (int i=;i<=n;i++) {
if (c[i]==-) {
c[i]=;
num[++snt][]++;
s[i]=snt;
dfs (i);
if (flag) {
cout<<"No solution"<<endl;
break;
}
}
}
if (!flag) {
dp[][]=;
for (int i=;i<=snt;i++)
for (int j=n/;j>=;j--) {
if (j>=num[i][]&&dp[i-][j-num[i][]])
{dp[i][j]=; ans[i][j]=;}
if (j>=num[i][]&&dp[i-][j-num[i][]])
{dp[i][j]=; ans[i][j]=;}
}
int t1;
for (int i=n/;i>=;i--)
if (dp[snt][i]) {t1=i;break;}
int _n=t1; int _s=snt;
while (_s) {
for (int i=;i<=n;i++)
if (s[i]==_s&&c[i]==ans[_s][_n]) c[i]=-;
_n-=num[_s][ans[_s][_n]];
_s--;
}
cout<<n-t1;
for (int i=;i<=n;i++)
if (c[i]>=) cout<<" "<<i;
cout<<endl;
cout<<t1;
for (int i=;i<=n;i++)
if (c[i]<) cout<<" "<<i;
cout<<endl; }
return ;
}

poj-1112 (二分图染色+dp分组)的更多相关文章

  1. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  2. 【POJ 1112】Team Them Up!(二分图染色+DP)

    Description Your task is to divide a number of persons into two teams, in such a way, that: everyone ...

  3. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  4. 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)

    圆桌会议必须满足:奇数个人参与,相邻的不能是敌人(敌人关系是无向边). 求无论如何都不能参加会议的骑士个数.只需求哪些骑士是可以参加的. 我们求原图的补图:只要不是敌人的两个人就连边. 在补图的一个奇 ...

  5. POJ 2942Knights of the Round Table(tarjan求点双+二分图染色)

    Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 13954   Accepted: 4673 Description Bein ...

  6. POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】

    LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...

  7. Relation(NOIP模拟赛)(二分图染色)

    原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...

  8. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  9. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

随机推荐

  1. Knights of a Polygonal Table CodeForces - 994B (贪心)

    大意:n个骑士, 每个骑士有战力p, 钱c, 每个骑士可以抢战力比他低的钱, 每个骑士最多抢k次, 对每个骑士求出最大钱数 按战力排序后, 堆维护动态前k大即可 #include <iostre ...

  2. python-day42--单表查询

    1. 简单查询select * from employee;select name,salary from employee; 2. where条件           1.比较运算符:> &l ...

  3. Android studio jni

    首先我们要明确几个概念,jni,ndk,共享库(.so). jni是java native interface的缩写,java 本地接口.它提供了若干的API实现了Java和其他语言的通信(主要是C/ ...

  4. 生成图片验证码(.NET)

    一.生成随机字符串 方法一: public string CreateRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6, ...

  5. svn出错:directory 'xxxx' is out of date

  6. MySQL解析过程、执行过程

    转载:https://student-lp.iteye.com/blog/2152601 https://www.cnblogs.com/cdf-opensource-007/p/6502556.ht ...

  7. vue 表单校验(二)

    vue 表单校验(二) vue element-ui表单校验 由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐, ...

  8. learning docker steps(5) ----- docker stack 初次体验

    参考:https://docs.docker.com/get-started/part5/ stack 技术栈.技术栈是一组相关的服务,它们共享依赖项并且可以一起进行编排和扩展.单个技术栈能够定义和协 ...

  9. node安装问题

    这个是我碰到的 这是解决方法,祝你好运

  10. L1-032 Left-pad

    根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的Re ...