-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path1507. Difficult Decision.java
executable file
·133 lines (105 loc) · 2.68 KB
/
1507. Difficult Decision.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import java.util.Scanner;
public class DifficultDecision {
public static class ZeroMatrix {
/* find zero matrices, compute sum, done */
public int values[][];
public int size;
public ZeroMatrix(int N) {
values = new int[N][N];
size = N;
}
public static ZeroMatrix zeroPower(ZeroMatrix M, int k) {
if (k == 1) {
return M;
} else {
if (k % 2 == 0) {
return zeroPower(zeroMul(M, M), k/2);
} else {
return zeroPower(zeroMul(M, M), (k - 1)/2);
}
}
}
public static ZeroMatrix zeroMul(ZeroMatrix A, ZeroMatrix B) {
int N = A.size;
ZeroMatrix M = new ZeroMatrix(N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
M.values[i][j] = 0;
for (int k = 0; k < N; k++) {
if (A.values[i][k] != 0 && B.values[k][j] != 0) {
M.values[i][j] = 1;
break;
}
}
}
}
return M;
}
public static ZeroMatrix zeroSum(ZeroMatrix A, ZeroMatrix B) {
int N = A.size;
ZeroMatrix M = new ZeroMatrix(N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
M.values[i][j] = A.values[i][j] + B.values[i][j];
}
}
return M;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
sb.append(String.format("%2d ", values[i][j]));
}
sb.append("\n");
}
return sb.toString();
}
public boolean hasZeros() {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (values[i][j] == 0) {
return true;
}
}
}
return false;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
ZeroMatrix A = new ZeroMatrix(N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
A.values[i][j] = sc.nextInt();
}
}
if (N == 1) {
if (A.values[0][0] == 0) {
System.out.println("No");
} else {
System.out.println("Yes");
}
System.exit(0);
}
int kmin = N*(N - 1);
int kmax = N*(N + 1);
ZeroMatrix powers[] = new ZeroMatrix[kmax - kmin];
powers[0] = ZeroMatrix.zeroPower(A, kmin);
for (int i = 1; i < (kmax - kmin); i++) {
powers[i] = ZeroMatrix.zeroMul(powers[i - 1], A);
}
ZeroMatrix zeroSum = powers[0];
for (int i = 1; i < (kmax - kmin); i++) {
zeroSum = ZeroMatrix.zeroSum(zeroSum, powers[i]);
}
if (zeroSum.hasZeros()) {
System.out.println("No");
} else {
System.out.println("Yes");
}
sc.close();
}
}