AOJ-1305: Membership Management
keyword
探索 Java
問題概要
ノード数V(<1100)のDAGが与えられる。あるノードから到達可能なsink(出次数0のノード)の数を求める問題。
解法
探索するだけ。グラフを構成する部分が面倒くさい。実装時間13分。
import java.util.HashSet; import java.util.Scanner; public class Main{ int N; String[][] strs; HashSet<String> visited, groupName, memberName; void run(){ Scanner in = new Scanner(System.in); for(;;){ N = in.nextInt(); if(N==0) return ; strs = new String[N][]; for(int i=0;i<N; i++){ String line = in.next(); strs[i] = line.replace(".","").split("[:,]"); } visited = new HashSet<String>(); groupName = new HashSet<String>(); memberName = new HashSet<String>(); System.out.println(solve()); } } void dfs(String str){ visited.add(str); if(groupName.contains(str)){ for(int i=0; i<N; i++){ if(strs[i][0].equals(str)){ for(int j=1; j<strs[i].length; j++)if(!visited.contains(strs[i][j])){ dfs(strs[i][j]); } return ; } } } else{ memberName.add(str); } } int solve(){ for(int i=0; i<N; i++){ groupName.add(strs[i][0]); } dfs(strs[0][0]); return memberName.size(); } public static void main(String args[]){ new Main().run(); } }