链接:http://acm.timus.ru/problem.aspx?space=1&num=1106
描述:有n(n<=100)个人,每个人有一个或多个朋友(朋友关系是相互的)。将其分成两组,使每一组都有朋友在另一个组。

思路:大意就是求一个子图使其是二分图。直接用dfs染色。 实际上不是二分图,因为本题每个子集里边可以有边相连,只要满足题目给的条件就行了。比二分图简单了一些。

//g++ 4.7.2

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int M = 100 + 10;
int color[M], vis[M]; //color[i]表示结点i的颜色,1表示黑色,2白色
vector<int> G[M];
void dfs(int u)
{
vis[u] = 1;
for (int i = 0; i < G[u].size(); ++i)
{
int v = G[u][i];
if (!vis[v])
{
color[v] = 3 - color[u];
dfs(v);
}
}
}
int main()
{
int n, t;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
while (scanf("%d", &t) && t)
{
G[i].push_back(t);
}
memset(vis, 0, sizeof(vis));
memset(color, 0, sizeof(color));
for (int i = 1; i <= n; ++i)
if (!vis[i])
{
color[i]=1; //每个新连通分量起始点都要设置为1
dfs(i);
}
int sum = 0;
for (int i = 1; i <= n; ++i)
if (color[i] == 1)
++sum;
printf("%d\n", sum);
for (int i = 1; i <= n; ++i)
if (color[i] == 1)
printf("%d ", i);
return 0;
}

还有一种方法差不多,看着像dfs实际不是,本题只需要对每个结点的邻接点染色就行,可以不用递归。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int M = 100 + 10;
int color[M], vis[M];
vector<int> G[M];
void coloring(int u)
{
vis[u] = 1;
color[u] = 1;
for (int i = 0; i < G[u].size(); ++i)
{
int v = G[u][i];
if (!vis[v])
color[v] = 3 - color[u];
vis[v] = 1;
}
}
int main()
{
int n, t;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
while (scanf("%d", &t) && t)
{
G[i].push_back(t);
}
memset(vis, 0, sizeof(vis));
memset(color, 0, sizeof(color));
for (int i = 1; i <= n; ++i)
if (!vis[i])
coloring(i);
int sum = 0;
for (int i = 1; i <= n; ++i)
if (color[i] == 1)
++sum;
printf("%d\n", sum);
for (int i = 1; i <= n; ++i)
if (color[i] == 1)
printf("%d ", i);
return 0;
}

ural 1106. Two Teams 二分图染色的更多相关文章

  1. URAL 1106 Two Teams二分图

    S - Two Teams Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submi ...

  2. ural 1106 Two Teams

    http://acm.timus.ru/problem.aspx?space=1&num=1106 #include <cstdio> #include <cstring&g ...

  3. URAL 1106 Two Teams (DFS)

    题意 小组里有N个人,每个人都有一个或多个朋友在小组里.将小组分成两个队伍,每个队伍的任意一个成员都有至少一个朋友在另一个队伍. 思路 一开始觉得和前几天做过的一道2-sat(每个队伍任意两个成员都必 ...

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

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

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

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

  6. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

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

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

  8. Codeforces Round #311 (Div. 2) D - Vitaly and Cycle(二分图染色应用)

    http://www.cnblogs.com/wenruo/p/4959509.html 给一个图(不一定是连通图,无重边和自环),求练成一个长度为奇数的环最小需要加几条边,和加最少边的方案数. 很容 ...

  9. SGU 172.eXam(二分图染色)

    时间限制:0.25s 空间限制:4M 题意: 将n(n<200)个点分成两个集合,给出m(m<=30000)对不能在一个集合的点对,判断能否分成满足要求的集合,输出其中一个集合和集合的总数 ...

随机推荐

  1. Eclipse不能自动编译 java文件,不会生成CLASS

    每次修改类代码后都得重启 Tomcat 花了1天终于解决,网上所说基本是下面1和2的方法,使用之后还是不行最后重新建工作环境导入项目对比了一下找到第三种方法 1.Project 下有个 "B ...

  2. 数据库(学习整理)----5--Oracle常用的组函数

    其他: 1.oracle中下标是从1开始的,Java下标是从0开始的 函数分类: 日期函数 字符函数 转换函数 数学函数 系统函数 ---在当前月份上面:增加.减少月份 select add_mont ...

  3. Java之final的解析

    在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量). 当用final修饰一个类时,表明这个类不能被继承. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦 ...

  4. android入门到熟练(一)

    1.andro系统架构:Linux内核层(提供驱动),系统运行库层和android运行时库(提供C/C++库的主要特性,如SQLite,OpenGL,Webkit等和Dalvik虚拟机),应用框架层, ...

  5. LVS 介绍以及配置应用

    1.负载均衡集群介绍 1.1.什么是负载均衡集群 负载均衡集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据的处理能力.提高网络的灵活性和可用性 搭建负 ...

  6. Excel里面将头尾第一个字母保留,去除中间的用*号代替,主要是REPT函数的应用,一开始我还以为要自己写个自定义函数

    Excel里面将头尾第一个字母保留,去除中间的用*号代替,主要是REPT函数的应用,一开始我还以为要自己写个自定义函数 =LEFT(A1,1)&REPT("*",(LEN( ...

  7. USACO 2.2 Subset Sums 集合(subset)

    Description 对于从1到N的连续整集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的: {3} ...

  8. js获取上传文件信息并及时查看

    <form id="picForm" name="picForm"  method="post" enctype="mult ...

  9. JavaScript学习心得(八)

    Cookie是Netscape发明的技术,是动态网站必不可少的部分,用于浏览器请求Web页面的超文本传输协议是一种无状态的协议. 两种方法维护状态:使用会话(session)(使用服务器技术实现,数据 ...

  10. https WebAPi

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...