计蒜客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复赛 贝壳找房魔法师顾问的主要内容,如果未能解决你的问题,请参考以下文章

贝壳找房魔法师顾问 2018 计蒜之道 复赛

贝壳找房魔法师顾问[并查集+DAG判断]

2018计蒜客复赛 贝壳找房函数最值(贪心+优先队列)

计蒜客 贝壳找房函数最值(好题,巧妙排序)

2018 计蒜之道 复赛

计蒜客2016复赛 菜鸟物流的运输网络 网络流EK