poj-1112 (二分图染色+dp分组)
#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分组)的更多相关文章
- POJ 1015 Jury Compromise dp分组
第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...
- 【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 ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
圆桌会议必须满足:奇数个人参与,相邻的不能是敌人(敌人关系是无向边). 求无论如何都不能参加会议的骑士个数.只需求哪些骑士是可以参加的. 我们求原图的补图:只要不是敌人的两个人就连边. 在补图的一个奇 ...
- POJ 2942Knights of the Round Table(tarjan求点双+二分图染色)
Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 13954 Accepted: 4673 Description Bein ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- Relation(NOIP模拟赛)(二分图染色)
原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...
- [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)
[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
随机推荐
- C语言的的free和c++的delete的区别
首先free对应的是malloc:delete对应的是new:free用来释放malloc出来动态内存,delete用来释放new出来的动态内存空间. 应用的区别为: 1. 数组的时候int *p=( ...
- 雷林鹏分享:C# 命名空间(Namespace)
C# 命名空间(Namespace) 命名空间的设计目的是为了提供一种让一组名称与其他名称分隔开的方式.在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突. 定义命名空间 命名 ...
- Vue.js 渲染函数, JSX(未掌握,未学完)
渲染函数 , JSX(没完成学习) 基础: 实例属性:vm.$slots default 属性包括了所有没有被包含在具名插槽中的节点. 渲染函数: render: function(createEle ...
- Confluence 6 嵌套用户组的示例
示例 1 : 用是一个子用户组成员 想象在你的目录服务器中,存在下面 2 个用户组: staff marketing 成员: marketing 用户组是 staff 的成员. 用户 jsmith ...
- Spring+Mybatis+Dubbo报错java.lang.reflect.MalformedParameterizedTypeException
原因是spring的jar文件冲突,排除spring的文件即可 <dependency> <groupId>com.alibaba</groupId> <ar ...
- 10046 event 知多少
10046 event 知多少 2017年5月10日 10:08 1.在当前session级打开trace 适用于SQL语句可以在新的session创建后再运行. 在session级收集10046 t ...
- Java容器涉及的类(代码)
Customer: public class Customer implements Comparable{ private Integer customerId; private String cu ...
- Syntax error: Bad for loop variable解决办法
从 ubuntu 6.10 开始,ubuntu 就将先前默认的bash shell 更换成了dash shell:其表现为 /bin/sh 链接倒了/bin/dash而不是传统的/bin/bash. ...
- skill prefix neo,non input 1
1● neo 新的 2● non 不,非,无
- c++ 发送消息,模拟拖拽文件
#include <ShlObj.h> BOOL SimulateDropFile(CString strFilePath) { }; wcstombs(szFile, strFilePa ...