package com.interview.flag.a; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * Created_By: stefanie * Date: 15-1-13 * Time: 下午6:33 */ class Player { String name; boolean play; Player preference; } public class A19_PlayerTeaming { class Group{ int id; int size = 1; boolean play = true; public Group(int id){ this.id = id; } } List<Player> players; HashMap<Player, Group> index; public List<List<Player>> createTeam(List<Player> players){ this.players = players; index = new HashMap(); for(int i = 0; i < players.size(); i++) index.put(players.get(i), new Group(i)); for(int i = 0; i < players.size(); i++){ Player player = players.get(i); if(player.play){ if(player.preference != null) union(player, player.preference); } else { Group group = find(player); group.play = false; } } HashMap<Integer, List<Player>> groups = new HashMap(); for(int i = 0; i < players.size(); i++){ Group group = find(players.get(i)); if(group.play){ if(groups.containsKey(group.id)){ groups.get(group.id).add(players.get(i)); } else { List<Player> groupPlayers = new ArrayList(); groupPlayers.add(players.get(i)); groups.put(group.id, groupPlayers); } } } return null; } public Group find(Player player){ Group group = index.get(player); while(!players.get(group.id).equals(player)){ player = players.get(group.id); group = index.get(player); } return group; } public void union(Player p1, Player p2){ Group group1 = find(p1); Group group2 = find(p2); if(group1.id == group2.id) return; if(group1.size < group2.size){ group1.id = group2.id; group2.size += group1.size; group2.play = group1.play && group2.play; } else { group2.id = group1.id; group1.size += group2.size; group1.play = group1.play && group2.play; } } }