计蒜客2018复赛 贝壳找房魔法师顾问
Posted black-fish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客2018复赛 贝壳找房魔法师顾问相关的知识,希望对你有一定的参考价值。
https://nanti.jisuanke.com/t/27647 题目链接
下面这个Solution是用并查集判断连通分量,再使用DFS判断一个连通分量是否为DAG,没有用拓扑排序。
1 import java.util.*; 2 import java.io.*; 3 4 public class Main{ 5 public static void main(String[] args) { 6 Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in))); 7 int n=in.nextInt(); 8 int[]a=new int[n]; 9 int[]b=new int[n]; 10 Map<Integer,Integer> map=new HashMap<>(); 11 12 String s1=in.next(); 13 for(int i=0;i<n;i++){ 14 a[i]=in.nextInt(); 15 } 16 17 String s2=in.next(); 18 for(int i=0;i<n;i++){ 19 b[i]=in.nextInt(); 20 } 21 int ans=0; 22 23 24 if(s1.equals("Constant") && s2.equals("Constant")){ 25 for(int i=0;i<n;i++){ 26 if(a[i]!=b[i]){ 27 ans=-1; 28 break; 29 } 30 } 31 } 32 33 else if(s2.equals("Constant") && s1.equals("Variable")){ 34 ans=getMagicNum(b,a); 35 } 36 else if(s1.equals("Constant") && s2.equals("Variable")){ 37 ans=getMagicNum(a,b); 38 } 39 40 41 else{ //both are variable// 42 DisjointUnionSets1 dus=new DisjointUnionSets1(100001); 43 for(int i=0;i<n;i++){ 44 if(a[i]!=b[i]) 45 dus.unite(a[i],b[i]); 46 } 47 for(int i=0;i<=100000;i++){ 48 if(dus.isRoot(i) && dus.getSize(i)>1) 49 ans+=dus.getSize(i)-1; 50 } 51 } 52 53 System.out.println(ans); 54 } 55 56 57 58 59 static int getMagicNum(int[]con, int[]var){ 60 int num=0; 61 DisjointUnionSets1 dus=new DisjointUnionSets1(100001); 62 Map<Integer,HashSet<Integer>> edge = new HashMap<>(); 63 Set<Integer> dus_element = new HashSet<>(); 64 65 for(int i=0;i<con.length;i++){ 66 if(var[i] != con[i]){ 67 dus.unite(var[i],con[i]); 68 dus_element.add(var[i]); 69 dus_element.add(con[i]); 70 if(edge.containsKey(var[i])) 71 edge.get(var[i]).add(con[i]); 72 else{ 73 HashSet<Integer> set =new HashSet<>(); 74 set.add(con[i]); 75 edge.put(var[i],set); 76 } 77 } 78 } 79 80 Map<Integer,HashSet<Integer>> connectedUnit = new HashMap<>(); 81 for(int ele:dus_element){ 82 int root=dus.find(ele); 83 if(connectedUnit.containsKey(root)) 84 connectedUnit.get(root).add(ele); 85 else{ 86 HashSet<Integer> set=new HashSet<>(); 87 set.add(ele); 88 connectedUnit.put(root,set); 89 } 90 } 91 92 Set<Map.Entry<Integer,HashSet<Integer>>> entrySet = connectedUnit.entrySet(); //获取连通分量// 93 for(Map.Entry<Integer,HashSet<Integer>> entry: entrySet){ 94 95 if(isDAG(entry.getValue(),edge)){ 96 num+=entry.getValue().size()-1; 97 } 98 else{ 99 num+=entry.getValue().size(); 100 } 101 } 102 return num; 103 } 104 105 106 107 108 static boolean isDAG(HashSet<Integer> set, Map<Integer,HashSet<Integer>> edge){ 109 Set<Integer> searched = new HashSet<>(); 110 for(int v:set){ 111 if(searched.contains(v)) 112 continue; 113 List<Integer> trace = new ArrayList<>(); 114 if(findCycle(v,edge,trace,searched)) 115 return false; 116 } 117 return true; 118 } 119 120 121 122 123 static boolean findCycle(int v, Map<Integer,HashSet<Integer>> edge, List<Integer> trace, Set<Integer> searched){ 124 int j=trace.indexOf(v); 125 if(j!=-1) 126 return true; 127 128 trace.add(v); 129 if(edge.containsKey(v)){ 130 for(int i: edge.get(v)){ 131 searched.add(i); 132 if(findCycle(i,edge,trace,searched)) 133 return true; 134 } 135 } 136 trace.remove(trace.get(trace.size()-1)); 137 return false; 138 } 139 140 }
以上是关于计蒜客2018复赛 贝壳找房魔法师顾问的主要内容,如果未能解决你的问题,请参考以下文章