Submission #1519126


Source Code Expand

import java.util.*;

public class Main{   
    
    static Scanner sc = new Scanner(System.in);
    
    static class SCC {
        boolean[] visited;
        int[] node_id;
        List<Integer> rev;

        int n;
        int[][] graph;
        int[][] r_graph;

        SCC(int[][] g) {
            n = g.length;
            graph = g;
            r_graph = new int[n][];
            int[] deg = new int[n];
            
            for (int i = 0 ; i < n ; i++) {
                for (int j : graph[i]) {
                    deg[j]++;
                }
            }
            
            for (int i = 0 ; i < n ; i++) {
                r_graph[i] = new int[deg[i]];
            }
            
            for (int i = 0 ; i < n ; i++) {
                for (int j : graph[i]) {
                    r_graph[j][--deg[j]] = i;
                }
            }            
        }
       
        int[] scc() {
            visited = new boolean[n];
            rev = new ArrayList<Integer>();
            
            for (int i = 0; i<n; i++) {
                if (!visited[i]) {
                    dfs(i);
                }
            }
            
            int id = 0;
            node_id = new int[n];
            visited = new boolean[n];
            
            for (int i = rev.size()-1; i>=0; i--) {
                if (!visited[rev.get(i)]) {
                    rdfs(rev.get(i), id);
                    id++;
                }
            }
            
            return node_id;
            
        }

        int[][] groups() {
            int max = 0;
            
            for (int nid : node_id) {
                max = Math.max(max, nid+1);
            }
            
            int[] gnum = new int[max];
            
            for (int nid : node_id) {
                gnum[nid]++;
            }
            
            int[][] groups = new int[max][];
            
            for (int i = 0 ; i < max ; i++) {
                groups[i] = new int[gnum[i]];
            }
            
            for (int i = 0 ; i < n ; i++) {
                int nid = node_id[i];
                groups[nid][--gnum[nid]] = i;
            }
            
            return groups;
        }

        public void dfs(int i) {
            visited[i] = true;
            for (int next : graph[i]) {
                if (!visited[next]) {
                    dfs(next);
                }
            }
            rev.add(i);
        }

        public void rdfs(int i, int id) {
            visited[i] = true;
            node_id[i] = id;
            for (int next : r_graph[i]) {
                if (!visited[next]) {
                    rdfs(next, id);
                }
            }
        }

        public int[][] groupGraph() {
            int max = 0;
            for (int nid : node_id) {
                max = Math.max(max, nid+1);
            }
            Set<Integer>[] eset = new Set[max];
            List<Integer>[] ged = new List[max];
            for (int i = 0; i < max; i++) {
                eset[i] = new HashSet<>();
                ged[i] = new ArrayList<>();
            }
            int[][] groupGraph = new int[max][];
            for (int fr = 0 ; fr < graph.length ; fr++) {
                for (int to : graph[fr]) {
                    int g1 = node_id[fr];
                    int g2 = node_id[to];
                    if (g1 != g2 && !eset[g1].contains(g2)) {
                        eset[g1].add(g2);
                        ged[g1].add(g2);
                    }
                }
            }
            for (int i = 0 ; i < max ; i++) {
                groupGraph[i] = new int[ged[i].size()];
                int idx = 0;
                for (int to : ged[i]) {
                    groupGraph[i][idx++] = to;
                }
            }
            return groupGraph;
        }
        
    }

    public static class State implements Comparable<State> {
        int gi;
        String x;

        State(int gi, String x) {
            this.gi = gi;
            this.x = x;
        }

        @Override
        public int compareTo(State o) {
            return x.compareTo(o.x);
        }
        
    }

    public static void main(String[] args) {       

        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();
        char[] c = new char[n];
        
        for (int i = 0; i < n; i++) {
            c[i] = sc.next().toCharArray()[0];
        }
        
        int[][] graph = buildDirectedGraph(n, m);

        SCC scc = new SCC(graph);
        scc.scc();
        
        int[][] groups = scc.groups();
        int[][] groupGraph = scc.groupGraph();
        int gn = groups.length;
        
        String[] gs = new String[gn];
        
        for (int i = 0 ; i < gn ; i++) {
            gs[i] = "";
            for (int v : groups[i]) {
                gs[i] += c[v];
            }
            char[] x = gs[i].toCharArray();
            Arrays.sort(x);
            gs[i] = String.valueOf(x);
        }

        String best = "~";
        String[][] dp = new String[gn][k+1];
        
        for (int i = 0 ; i < gn ; i++) {
            Arrays.fill(dp[i], "~");
        }
        
        Queue<State> q = new PriorityQueue<>();
        
        for (int i = 0 ; i < gn ; i++) {
            dp[i][0] = "";
            q.add(new State(i, ""));
        }

        while (q.size() >= 1) {
            State s = q.poll();
            int now = s.gi;

            int len = gs[now].length();
            
            for (int take = 0 ; take <= len ; take++) {
                String tx = s.x + gs[now].substring(0, take);
                int tl = tx.length();
                if (tl > k) {
                    break;
                }
                if (tl == k && tx.compareTo(best) < 0) {
                    best = tx;
                }
                for (int to : groupGraph[now]) {
                    if (tx.compareTo(dp[to][tl]) < 0) {
                        dp[to][tl] = tx;
                        q.add(new State(to, tx));
                    }
                }
            }
            
        }
        
        System.out.println(best.equals("~") ? -1 : best);
        
    }

    static int[][] buildDirectedGraph(int n, int m) {
        int[][] edges = new int[m][];
        int[][] graph = new int[n][];
        int[] deg = new int[n];
        
        for (int i = 0 ; i < m ; i++) {
            int a = sc.nextInt()-1;
            int b = sc.nextInt()-1;
            deg[a]++;
            edges[i] = new int[]{a, b};
        }
        
        for (int i = 0 ; i < n ; i++) {
            graph[i] = new int[deg[i]];
        }
        
        for (int i = 0 ; i < m ; i++) {
            int a = edges[i][0];
            int b = edges[i][1];
            graph[a][--deg[a]] = b;
        }
        
        return graph;
        
    }
      
}       

Submission Info

Submission Time
Task C - 有向グラフ
User suesue
Language Java8 (OpenJDK 1.8.0)
Score 100
Code Size 7148 Byte
Status AC
Exec Time 285 ms
Memory 66536 KB

Compile Error

Note: ./Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 4
AC × 32
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt
All subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt, subtask1_manual01.txt, subtask1_manual02.txt, subtask1_manual03.txt, subtask1_manual04.txt, subtask1_manual05.txt, subtask1_manual06.txt, subtask1_manual07.txt, subtask1_manual08.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_special01.txt, subtask1_special02.txt, subtask1_special03.txt, subtask1_special04.txt, subtask1_special05.txt, subtask1_special06.txt, subtask1_special07.txt, subtask1_special08.txt, subtask1_special09.txt, subtask1_special10.txt, subtask1_special11.txt, subtask1_special12.txt, subtask1_special13.txt, subtask1_special14.txt, subtask1_special15.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 98 ms 21712 KB
subtask0_sample_02.txt AC 96 ms 20692 KB
subtask0_sample_03.txt AC 93 ms 19924 KB
subtask0_sample_04.txt AC 96 ms 19668 KB
subtask1_manual01.txt AC 96 ms 19796 KB
subtask1_manual02.txt AC 97 ms 19924 KB
subtask1_manual03.txt AC 97 ms 21588 KB
subtask1_manual04.txt AC 97 ms 19540 KB
subtask1_manual05.txt AC 97 ms 18772 KB
subtask1_manual06.txt AC 97 ms 18772 KB
subtask1_manual07.txt AC 98 ms 19540 KB
subtask1_manual08.txt AC 98 ms 21588 KB
subtask1_random01.txt AC 184 ms 30376 KB
subtask1_random02.txt AC 169 ms 23784 KB
subtask1_random03.txt AC 227 ms 39016 KB
subtask1_random04.txt AC 190 ms 26164 KB
subtask1_random05.txt AC 158 ms 24424 KB
subtask1_special01.txt AC 125 ms 22740 KB
subtask1_special02.txt AC 178 ms 25364 KB
subtask1_special03.txt AC 229 ms 44588 KB
subtask1_special04.txt AC 254 ms 54300 KB
subtask1_special05.txt AC 268 ms 66536 KB
subtask1_special06.txt AC 262 ms 62424 KB
subtask1_special07.txt AC 263 ms 40936 KB
subtask1_special08.txt AC 264 ms 59288 KB
subtask1_special09.txt AC 257 ms 62388 KB
subtask1_special10.txt AC 278 ms 60476 KB
subtask1_special11.txt AC 266 ms 61016 KB
subtask1_special12.txt AC 265 ms 58016 KB
subtask1_special13.txt AC 266 ms 56064 KB
subtask1_special14.txt AC 108 ms 20808 KB
subtask1_special15.txt AC 285 ms 65852 KB