• 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]
  • 相关阅读:
    iOS开发之Xcode8兼容适配iOS 10资料整理笔记
    C#流概述
    C#回调实现的一般过程
    ASP.Net MVC的学习
    RAID基本知识
    Infiniband基本知识
    [转]开源实时视频码流分析软件:VideoEye
    [转]高分一号的落后与特色
    [转]MVC,MVP 和 MVVM 的图示
    图文助你打开MS SQL Serever的ldf和mdf文件
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114134.html
Copyright © 2020-2023  润新知