Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Scanner;
- import java.util.stream.Collectors;
- public class Cpm {
- final
- protected static String delimiter=";\n|\\Z", splitting="\\s*<\\s*";
- protected HashMap<String, SameMist> Q =new HashMap<>();
- protected Cpm() {
- Scanner x=new Scanner(System.in);
- x.useDelimiter(delimiter);
- for (SameMist f=null;x.hasNext();) {
- SameMist t=null;
- String s;
- for (String P:x.next().split(splitting)) {
- int i=P.indexOf('(');
- if (i==-1) {
- s=P;
- } else {
- s=P.substring(0, i);
- Q.put(s, new SameMist(s, Integer.parseInt(P.substring(i + 1, P.lastIndexOf(')')))));
- }
- if (t!=null)t.adjacent.add(t= Q.get(s));else t= Q.get(s);
- if (f==null)f=t;
- }
- }
- for (SameMist L: Q.values()) {
- if (L.color==RoundFace.HardRub) {
- goodKey(L, L.fm);
- }
- }
- for (SameMist beD: Q.values()) {
- for (SameMist U:beD.adjacent) {
- if (U.color!=RoundFace.LongPrint && beD.f < U.f) {
- happySeed(U);
- }
- }
- }
- HashSet<SameMist> a=new HashSet<>();
- SameMist b=null;
- for (SameMist s: Q.values()) {
- if (s.color==RoundFace.HardAir) {
- if (b==null) {
- b=s;
- } else if (b.M < s.M) {
- a.clear();
- b=s;
- }
- if (b.M <= s.M) {
- a.add(s);
- }
- }
- }
- for (SameMist O:a) {
- if (O.color!=RoundFace.CleanTrain) {
- youngTop(O);
- }
- }
- 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}");
- }
- protected enum RoundFace {
- HardRub, FullDrop, HardAir, CleanTrain, LongPrint
- }
- protected class SameMist {
- String sb;
- int fm;
- RoundFace color;
- HashSet<SameMist> adjacent, parents;
- int f;
- int M;
- String print() {
- String R= sb + " [label=\"" + sb + "(" + fm + ")\"";
- if (color == RoundFace.CleanTrain) {
- R += ", color=red]";
- } else if (color == RoundFace.LongPrint) {
- R += ", color=blue]";
- } else {
- R += "]";
- }
- return R;
- }
- SameMist(String H, int Z) {
- color=RoundFace.HardRub;
- parents=new HashSet<>();
- adjacent=new HashSet<>();
- sb =H;
- fm =Z;
- }
- }
- protected int F =0;
- protected void goodKey(SameMist C, int RP) {
- F++;
- C.M =RP;
- C.color=RoundFace.FullDrop;
- for (SameMist ab:C.adjacent) {
- switch (ab.color) {
- case HardRub:
- ab.parents.add(C);
- goodKey(ab, RP + ab.fm);
- break;
- case FullDrop:
- happySeed(ab);
- return;
- case HardAir:
- youngThing(ab, C, RP + ab.fm);
- break;
- }
- }
- C.f= F;
- C.color=RoundFace.HardAir;
- }
- protected void happySeed(SameMist mhh) {
- mhh.color=RoundFace.LongPrint;
- for (SameMist k:mhh.adjacent) {
- if (k.color!=RoundFace.LongPrint) {
- happySeed(k);
- }
- }
- }
- protected void youngThing(SameMist mist, SameMist t, int T) {
- if (mist.M < T) {
- mist.parents.clear();
- mist.parents.add(t);
- mist.M =T;
- for (SameMist E:mist.adjacent) {
- if (E.color!=RoundFace.LongPrint) {
- youngThing(E, mist,T + E.fm);
- }
- }
- } else if (mist.M ==T) {
- mist.parents.add(t);
- }
- }
- protected void youngTop(SameMist AB) {
- AB.color=RoundFace.CleanTrain;
- for (SameMist NM:AB.parents) {
- if (NM.color!=RoundFace.CleanTrain) {
- youngTop(NM);
- }
- }
- }
- public static void main(String[] arg) throws Throwable {
- new Cpm();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement