Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.90 KB | None | 0 0
  1. import java.util.HashMap;
  2. import java.util.HashSet;
  3. import java.util.Scanner;
  4. import java.util.stream.Collectors;
  5.  
  6. public class Cpm {
  7.  
  8.     final
  9.     protected static String delimiter=";\n|\\Z", splitting="\\s*<\\s*";
  10.     protected HashMap<String, SameMist> Q =new HashMap<>();
  11.  
  12.     protected Cpm() {
  13.         Scanner x=new Scanner(System.in);
  14.         x.useDelimiter(delimiter);
  15.         for (SameMist f=null;x.hasNext();) {
  16.             SameMist t=null;
  17.             String s;
  18.             for (String P:x.next().split(splitting)) {
  19.                 int i=P.indexOf('(');
  20.                 if (i==-1) {
  21.                     s=P;
  22.                 } else {
  23.                     s=P.substring(0, i);
  24.                     Q.put(s, new SameMist(s, Integer.parseInt(P.substring(i + 1, P.lastIndexOf(')')))));
  25.                 }
  26.                 if (t!=null)t.adjacent.add(t= Q.get(s));else t= Q.get(s);
  27.                 if (f==null)f=t;
  28.             }
  29.         }
  30.         for (SameMist L: Q.values()) {
  31.             if (L.color==RoundFace.HardRub) {
  32.                 goodKey(L, L.fm);
  33.             }
  34.         }
  35.         for (SameMist beD: Q.values()) {
  36.             for (SameMist U:beD.adjacent) {
  37.                 if (U.color!=RoundFace.LongPrint && beD.f < U.f) {
  38.                     happySeed(U);
  39.                 }
  40.             }
  41.         }
  42.         HashSet<SameMist> a=new HashSet<>();
  43.         SameMist b=null;
  44.         for (SameMist s: Q.values()) {
  45.             if (s.color==RoundFace.HardAir) {
  46.                 if (b==null) {
  47.                     b=s;
  48.                 } else if (b.M < s.M) {
  49.                     a.clear();
  50.                     b=s;
  51.                 }
  52.                 if (b.M <= s.M) {
  53.                     a.add(s);
  54.                 }
  55.             }
  56.         }
  57.         for (SameMist O:a) {
  58.             if (O.color!=RoundFace.CleanTrain) {
  59.                 youngTop(O);
  60.             }
  61.         }
  62.         System.out.println("digraph {\n  " + Q.values().stream().map(SameMist::print).collect(Collectors.joining("\n  ")) + Q.values().stream().map(u -> u.adjacent.stream().map(adjacent -> "\n  " + u.sb + " -> " + adjacent.sb + (u.color==RoundFace.CleanTrain && adjacent.color==RoundFace.CleanTrain && adjacent.parents.contains(u) ? " [color=red]":(u.color==RoundFace.LongPrint && adjacent.color==RoundFace.LongPrint ? " [color=blue]":""))).collect(Collectors.joining())).collect(Collectors.joining()) + "\n}");
  63.     }
  64.  
  65.     protected enum RoundFace {
  66.         HardRub, FullDrop, HardAir, CleanTrain, LongPrint
  67.     }
  68.  
  69.     protected class SameMist {
  70.  
  71.         String sb;
  72.         int fm;
  73.         RoundFace color;
  74.         HashSet<SameMist> adjacent, parents;
  75.         int f;
  76.         int M;
  77.  
  78.         String print() {
  79.             String R= sb + " [label=\"" + sb + "(" + fm + ")\"";
  80.             if (color == RoundFace.CleanTrain) {
  81.                 R += ", color=red]";
  82.             } else if (color == RoundFace.LongPrint) {
  83.                 R += ", color=blue]";
  84.             } else {
  85.                 R += "]";
  86.             }
  87.             return R;
  88.         }
  89.  
  90.         SameMist(String H, int Z) {
  91.             color=RoundFace.HardRub;
  92.             parents=new HashSet<>();
  93.             adjacent=new HashSet<>();
  94.             sb =H;
  95.             fm =Z;
  96.         }
  97.  
  98.     }
  99.  
  100.     protected int F =0;
  101.  
  102.     protected void goodKey(SameMist C, int RP) {
  103.         F++;
  104.         C.M =RP;
  105.         C.color=RoundFace.FullDrop;
  106.         for (SameMist ab:C.adjacent) {
  107.             switch (ab.color) {
  108.                 case HardRub:
  109.                     ab.parents.add(C);
  110.                     goodKey(ab, RP + ab.fm);
  111.                     break;
  112.                 case FullDrop:
  113.                     happySeed(ab);
  114.                     return;
  115.                 case HardAir:
  116.                     youngThing(ab, C, RP + ab.fm);
  117.                     break;
  118.             }
  119.         }
  120.         C.f= F;
  121.         C.color=RoundFace.HardAir;
  122.     }
  123.  
  124.     protected void happySeed(SameMist mhh) {
  125.         mhh.color=RoundFace.LongPrint;
  126.         for (SameMist k:mhh.adjacent) {
  127.             if (k.color!=RoundFace.LongPrint) {
  128.                 happySeed(k);
  129.             }
  130.         }
  131.     }
  132.  
  133.     protected void youngThing(SameMist mist, SameMist t, int T) {
  134.         if (mist.M < T) {
  135.             mist.parents.clear();
  136.             mist.parents.add(t);
  137.             mist.M =T;
  138.             for (SameMist E:mist.adjacent) {
  139.                 if (E.color!=RoundFace.LongPrint) {
  140.                     youngThing(E, mist,T + E.fm);
  141.                 }
  142.             }
  143.         } else if (mist.M ==T) {
  144.             mist.parents.add(t);
  145.         }
  146.     }
  147.  
  148.     protected void youngTop(SameMist AB) {
  149.         AB.color=RoundFace.CleanTrain;
  150.         for (SameMist NM:AB.parents) {
  151.             if (NM.color!=RoundFace.CleanTrain) {
  152.                 youngTop(NM);
  153.             }
  154.         }
  155.     }
  156.  
  157.     public static void main(String[] arg) throws Throwable {
  158.         new Cpm();
  159.     }
  160.  
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement