URAL 1106 Two Teams (DFS)
题意
小组里有N个人,每个人都有一个或多个朋友在小组里。将小组分成两个队伍,每个队伍的任意一个成员都有至少一个朋友在另一个队伍。
思路
一开始觉得和前几天做过的一道2-sat(每个队伍任意两个成员都必须互相认识)相似然后就往那边想了……看了题解才发现这题很简单……
我们注意到同组里的人是互不影响的,所以一个人如果已经确定在哪组的话是不会对后面进入这个组的人产生影响的。
所以我们按顺序直接搜就可以了,每个人在他朋友里面找一个已经确定组的,然后放到对面组。如果他的所有朋友都没确定,把他随便放一个组就行了。
代码
[java]
import java.util.*;
import java.util.Map.Entry;
import java.math.*;
public class Main{
static int group[] = new int [205];
static Vector <Vector> adj = new Vector <Vector> ();
public static int divide(int p){
group[p+1] = -2;
for (int j = 0; j < adj.get(p).size(); j ++){
int v = (int) adj.get(p).get(j);
if (group[v] == -1){
return (group[p+1] = 1 - divide(v-1));
}
if (group[v] > -1){
return (group[p+1] = 1 - group[v]);
}
}
if (group[p+1] == -2) return (group[p+1] = 0);
return 0;
}
public static void main(String args[]){
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for (int i = 1; i <= n; i ++){
int tmp = 0;
Vector <Integer> tmpv = new Vector <Integer> ();
while((tmp = cin.nextInt()) != 0){
tmpv.addElement(tmp);
}
adj.addElement(tmpv);
}
boolean ok = true;
for (int i = 0; i < adj.size(); i ++){
group[i+1] = -1;
if (adj.get(i).size() == 0){
ok = false;
break;
}
}
for (int i = 0; i < adj.size(); i ++){
group[i+1] = divide(i);
}
if (ok == false){
System.out.println("0");
}
else{
Vector <Integer> ans = new Vector <Integer> ();
for (int i = 1; i <= n; i ++){
if (group[i] == 0){
ans.addElement(i);
}
}
System.out.println(ans.size());
for (int i = 0; i < ans.size(); i ++){
if (i > 0) System.out.print(" ");
System.out.print(ans.get(i));
}
System.out.println("");
}
cin.close();
}
}
[/java]
URAL 1106 Two Teams (DFS)的更多相关文章
- 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 描述:有n(n<=100)个人,每个人有一个或多个朋友(朋友关系是相互的).将其 ...
- ural 1106 Two Teams
http://acm.timus.ru/problem.aspx?space=1&num=1106 #include <cstdio> #include <cstring&g ...
- URAL 1208 Legendary Teams Contest(DFS)
Legendary Teams Contest Time limit: 1.0 secondMemory limit: 64 MB Nothing makes as old as years. A l ...
- ural 1106,二分图染色,DFS
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1106 乍一眼看上去,好像二分图匹配,哎,想不出和哪一种匹配类似,到网上查了一下,DFS染 ...
- 1106. Two Teams(dfs 染色)
1106 结点染色 当前结点染为黑 朋友染为白 依次染下去 这题是为二分图打基础吧 #include <iostream> #include<cstdio> #include ...
- timus 1106 Two Teams(二部图)
Two Teams Time limit: 1.0 secondMemory limit: 64 MB The group of people consists of N members. Every ...
- URAL 1137Bus Routes (dfs)
Z - Bus Routes Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- ural 1208 Legendary Teams Contest
题意描述:给定K支队伍,每队三个队员,不同队伍之间队员可能部分重复,输出这些队员同时能够组成多少完整的队伍: DFS,利用DFS深度优先搜索,如果该队所有队员都没有被访问过,那么将该队计入结果,再去选 ...
随机推荐
- Meaning of “const” last in a C++ method declaration?
函数尾部的const是什么意思? 1 Answer by Jnick Bernnet A "const function", denoted with the keyword co ...
- HDU_2888_Check Corners
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 第二次作业(WordCount)
1 Github项目地址:https://gitee.com/DamonGetup/WordCount/tree/master 2 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出 ...
- vue - webpack、babel
一.webpack 在这里我仅仅的是对webpack做个讲解,webpack这个工具非常强大,解决了我们前端很繁琐的一些工具流程繁琐的事情.如果感兴趣的同学,建议还是看官网吧. 中文链接地址:http ...
- linux IO多路复用POLL机制深入分析
POLL机制的作用这里就不进行介绍,根据linux man手册,解释为在一个文件描述符上等待某个事件.按照抽象一点的理解,当某个事件被触发(条件被满足),文件描述符变为有状态,那么用户空间可以根据此进 ...
- MySQL的redo log结构和SQL Server的log结构对比
MySQL的redo log结构和SQL Server的log结构对比 innodb 存储引擎 mysql技术内幕 log buffer根据一定规则将内存中的log block刷写到磁盘,这个规则是 ...
- 10.numpy基本用法
参考: https://blog.csdn.net/sinat_32547403/article/details/54017551
- [py]django的manytomany字段和后台搜索过滤功能
我本来想搞下Django之select_related和prefetch_related的区别,看到这里有djangoapi的知识, 之前搞过django restfulapi,http://blog ...
- Java面向对象---重写(Override)与重载(Overload)
一.重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说 ...
- IDEA,与gradle引入jar包报错
Warning:<i><b>root project 'netty_lecture': Unable to resolve additional project configu ...