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]

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值