Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Scanner;
- public class Cpm {
- private static ArrayList<Work> W = new ArrayList<>();
- private static ArrayList<String> dict = new ArrayList<>();
- private static void DFS(int n){
- W.get(n).color = 1;
- for (int i : W.get(n).E) {
- if(W.get(i).color == 0){
- DFS(i);
- } else if(W.get(i).color == 1){
- if (!W.get(i).wrong) {
- delCycles(i);
- }
- }
- }
- W.get(n).color = 2;
- }
- private static void delCycles(int n){
- W.get(n).wrong = true;
- for (int i : W.get(n).E) {
- if (!W.get(i).wrong) {
- delCycles(i);
- }
- }
- }
- private static void calcSums(int n){
- W.get(n).color = 1;
- for (int i : W.get(n).E) {
- if(!W.get(i).wrong && W.get(i).color == 2){
- calcSums(i);
- }
- }
- W.get(n).color = 0;
- int max = -1;
- for (int i : W.get(n).E) {
- if(!W.get(i).wrong){
- if(W.get(i).sum > max) {
- max = W.get(i).sum;
- }
- }
- }
- W.get(n).sum += max;
- }
- private static void findWay(int n){
- W.get(n).color = 3;
- int max = -1;
- ArrayList<Integer> ind = new ArrayList<>();
- for (int i : W.get(n).E) {
- if(!W.get(i).wrong){
- if(W.get(i).sum == max) ind.add(i);
- if(W.get(i).sum > max) {
- max = W.get(i).sum;
- ind.clear();
- ind.add(i);
- }
- }
- }
- if(!ind.isEmpty()){
- for (Integer i : ind) {
- W.get(n).clrs.add(i);
- findWay(i);
- }
- }
- }
- public static void main(String[] args){
- Scanner in = new Scanner(System.in);
- StringBuilder input = new StringBuilder();
- while(in.hasNext()){
- input.append(in.nextLine());
- }
- for (String s : input.toString().replace(" ", "").split(";")) {
- String[] w = s.split("<");
- for (int i = 0; i < w.length; i++){
- String name = w[i];
- if (name.contains("(")){
- int time = Integer.parseInt(name.split("\\(")[1].replace(")", ""));
- name = name.split("\\(")[0];
- dict.add(name);
- W.add(new Work(time));
- }
- if (i != 0){
- int from = dict.indexOf(w[i-1].split("\\(")[0]), to = dict.indexOf(w[i].split("\\(")[0]);
- if(!W.get(from).E.contains(to)){
- W.get(from).E.add(to);
- }
- }
- }
- }
- for (int i = 0; i < W.size(); i++){
- if(W.get(i).color == 0){
- DFS(i);
- }
- }
- for (int i = 0; i < W.size(); i++) {
- if (!W.get(i).wrong && W.get(i).color == 2) {
- calcSums(i);
- }
- }
- int max = -1;
- ArrayList<Integer> ind = new ArrayList<>();
- for (int i = 0; i < W.size(); i++) {
- if(!W.get(i).wrong){
- if(W.get(i).sum == max) ind.add(i);
- if(W.get(i).sum > max) {
- max = W.get(i).sum;
- ind.clear();
- ind.add(i);
- }
- }
- }
- for (Integer i : ind) {
- findWay(i);
- }
- System.out.println("digraph {");
- for(int i = 0; i < W.size(); i++){
- System.out.print(" " + dict.get(i) + " [label = \"" + dict.get(i) + "(" + W.get(i).time + ")\"");
- if(W.get(i).wrong) System.out.println(", color = blue]");
- else if(W.get(i).color == 3) System.out.println(", color = red]");
- else System.out.println("]");
- }
- for(int i = 0; i < W.size(); i++){
- for(int j : W.get(i).E){
- System.out.print(" " + dict.get(i) + " -> " + dict.get(j));
- if(W.get(i).wrong) System.out.println(" [color = blue]");
- else if(W.get(i).clrs.contains(j)) System.out.println(" [color = red]");
- else System.out.println();
- }
- }
- System.out.println("}");
- }
- private static class Work{
- int time, sum, color;
- ArrayList<Integer> E;
- ArrayList<Integer> clrs;
- boolean wrong;
- private Work(int t){
- wrong = false;
- time = t;
- sum = time;
- color = 0;
- E = new ArrayList<>();
- clrs = new ArrayList<>();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement