#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. NIO 之 ByteBuffer

    前言 对于刚接触ByteBuffer人来说,想要完全理解会稍微有点困难,正巧前几天有人问我,想到好久没写文章,就整理一下. 概念理解 对于ByteBuffer的一些概念不理解的情况下,如果直接打开源码 ...

  2. C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)

    int [] numbers = new int[5]; // 长度为5,元素类型为 int. string[,] names = new string[5,4]; // 5*4 的二维数组 byte ...

  3. Assert.IsNotNull 方法(判断对象不为NULL)

    Assert.IsNotNull 方法 Visual Studio 2012   其他版本 Visual Studio 2010 Visual Studio 2008 Visual Studio 20 ...

  4. 4-10 辅助方法controll_name,;SanitizeHelper; 伪元素和scss中的&, @Media; cache介绍。

    回顾知识点 1. 在application.html.erb中: <main class="<%= controller.controller_name%>"&g ...

  5. golang martini 源码阅读笔记之inject

    martini是go语言写的一个超级轻量的web开源框架,具体源码可在github搜索找到.13年那会开始接触go语言时有稍微看过这个框架,由于之后没有继续使用go就慢慢忽略了,最近由于手头项目可能会 ...

  6. thinkphp条件查询

    1.这是我在做项目的时候编写的: $profit = M('shipping_types',' ','DB_PROFIT');//没有表前缀,在M函数的第二个参数就为空. //条件$field = a ...

  7. 安装 Android Studio

    安装 Android Studio 只需轻松点击几下.(您需要已下载 Android Studio.) 若使用 JDK 1.8,在 Mac 系统上运行 Android Studio 可能出现一些已知的 ...

  8. JavaScript 运行机制详解:Event Loop——续

    转自:http://www.ruanyifeng.com/blog/2014/10/event-loop.html 五.定时器 除了放置异步任务的事件,"任务队列"还可以放置定时事 ...

  9. JavaScript学习总结(十一)——Object类详解

    一.Object类介绍 Object类是所有JavaScript类的基类(父类),提供了一种创建自定义对象的简单方式,不再需要程序员定义构造函数. 二.Object类主要属性 1.constructo ...

  10. 获取URL中的链接(可中文也可英文)

    //既能获取中文url也能英文function getUrlParam(key) { // 获取参数 var url = window.location.search; // 正则筛选地址栏 var ...