ural 1106. Two Teams 二分图染色
链接: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 二分图染色的更多相关文章
- URAL 1106 Two Teams二分图
S - Two Teams Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submi ...
- ural 1106 Two Teams
http://acm.timus.ru/problem.aspx?space=1&num=1106 #include <cstdio> #include <cstring&g ...
- URAL 1106 Two Teams (DFS)
题意 小组里有N个人,每个人都有一个或多个朋友在小组里.将小组分成两个队伍,每个队伍的任意一个成员都有至少一个朋友在另一个队伍. 思路 一开始觉得和前几天做过的一道2-sat(每个队伍任意两个成员都必 ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
圆桌会议必须满足:奇数个人参与,相邻的不能是敌人(敌人关系是无向边). 求无论如何都不能参加会议的骑士个数.只需求哪些骑士是可以参加的. 我们求原图的补图:只要不是敌人的两个人就连边. 在补图的一个奇 ...
- Codeforces Round #311 (Div. 2) D - Vitaly and Cycle(二分图染色应用)
http://www.cnblogs.com/wenruo/p/4959509.html 给一个图(不一定是连通图,无重边和自环),求练成一个长度为奇数的环最小需要加几条边,和加最少边的方案数. 很容 ...
- SGU 172.eXam(二分图染色)
时间限制:0.25s 空间限制:4M 题意: 将n(n<200)个点分成两个集合,给出m(m<=30000)对不能在一个集合的点对,判断能否分成满足要求的集合,输出其中一个集合和集合的总数 ...
随机推荐
- ul ol dl
1.ul是无序列表,也就是说没有排列限制可以随意加li: <ul> <li>可以随意放置</li> <li>可以随意放置</li> < ...
- shell命令:echo命令详解
功能说明:显示文字. 语 法:echo [-ne][字符串] / echo [--help][--version] 补充说明:echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在 ...
- odoo9 install
odoo9 的安装需要 nodejs 的 lessc 命令. 需要先安装nodejs 后,使用nmp(nodejs的一个包管理工具) 安装lessc等功能. window 1:安装nodejs. 安装 ...
- Warning: Invalid argument supplied for foreach()
经常对提交过来的数据进行双重循环,但是为空时会报错:Warning: Invalid argument supplied for foreach() 如下解决即可:foreach($data[$i] ...
- Chaperon简介
Chaperon是一个可以把有结构的Text转换成XML.它包括一个强大的LALR(1)解析器来解析Text和一个可以用来创建XML文档的Tree builder. http://chaperon.s ...
- SignalR介绍与Asp.net,前台即时通信【转】
SignalR 是一个asp.net异步库,它提供广播消息到多个client端的机制. SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在线预订系统,股票交易等实 ...
- VC6.0中重载操作符函数无法访问类的私有成员
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
- http server v0.1_http_webapp.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- bzoj 2209: [Jsoi2011]括号序列 splay
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 833 Solved: 392[Submit][Status ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...