現在,AtCoderでABC204-Cを解いています。
以下のようなコードを用いた結果、TLEとなりました。
Java
1import java.util.Scanner; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner scanner = new Scanner(System.in); 6 7 int N = scanner.nextInt(); 8 boolean[][] can = new boolean[N][N]; 9 boolean[][] befor = new boolean[N][N]; 10 int M = scanner.nextInt(); 11 int ans = 0; 12 13 for (int i = 0; i < N; i++) { 14 for (int j = 0; j < N; j++) { 15 befor[i][j] = true; 16 } 17 } 18 19 for (int i = 0; i < N; i++) { 20 can[i][i] = true; 21 } 22 23 for (int i = 0; i < M; i++) { 24 int from = scanner.nextInt(); 25 int to = scanner.nextInt(); 26 27 can[from - 1][to - 1] = true; 28 } 29 30 while (can != befor) { 31 for (int i = 0; i < N; i++) { 32 for (int j = 0; j < N; j++) { 33 befor[i][j] = can[i][j]; 34 } 35 } 36 37 for (int i = 0; i < N; i++) { 38 for (int j = 0; j < N; j++) { 39 if (can[i][j]) { 40 for (int k = 0; k < N; k++) { 41 can[i][k] |= can[j][k]; 42 } 43 } 44 } 45 } 46 } 47 48 for (int i = 0; i < N; i++) { 49 for (int j = 0; j < N; j++) { 50 if (can[i][j]) { 51 ans++; 52 } 53 } 54 } 55 56 System.out.println(ans); 57 } 58}
元々はwhile内の
Java
1for (int i = 0; i < N; i++) { 2 for (int j = 0; j < N; j++) { 3 befor[i][j] = can[i][j]; 4 } 5}
を
Java
1befor = can;
としていたため実行スピードに問題はなかったのですが、前述の通り変更した事により、実行時間が非常に伸びてしまいました。
多次元配列のdeepコピーの方法を検索してみましたが、for文を用いたものしか見当たらず、より高速な方法がないものかと思い質問いたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/03 06:55