Yesterday, my teacher taught me about bit operators: and (&), or (|), xor (^). I generated a number table a[N], and wrote a program to calculate the matrix table b[N][N] using three kinds of bit operator. I thought my achievement would get teacher‘s attention.
The key function is the code showed below.
There is no doubt that my teacher raised lots of interests in my work and was surprised to my talented programming skills. After deeply thinking, he came up with another problem: if we have the matrix table b[N][N] at first, can you check whether corresponding number table a[N] exists?
InputThere are multiple test cases.
For each test case, the first line contains an integer N, indicating the size of the matrix. (1 <= N <= 500).
The next N lines, each line contains N integers, the jth integer in ith line indicating the element b[i][j] of matrix. (0 <= b[i][j] <= 2
31 - 1)
OutputFor each test case, output "YES" if corresponding number table a[N] exists; otherwise output "NO".Sample Input
2 0 4 4 0 3 0 1 24 1 0 86 24 86 0
Sample Output
YES NO
1 // ConsoleApplication2.cpp: 定义控制台应用程序的入口点。 2 // 3 4 // ConsoleApplication1.cpp: 定义控制台应用程序的入口点。 5 // 6 7 #include "stdafx.h" 8 #include<stack> 9 #include<cstdio> 10 #include<cstring> 11 #include<iostream> 12 #include<algorithm> 13 #define mem(array) memset(array,0,sizeof(array)) 14 using namespace std; 15 16 const int maxn = 6000; 17 const int maxm = 999999; 18 19 stack<int> S; 20 21 struct node { 22 int to, next; 23 }e[maxm]; 24 25 int k, n, tot, index; 26 int Low[maxn], Dfn[maxn], head[maxn], cmp[maxn],map[505][505]; 27 bool use[maxn]; 28 29 void Inite() { 30 k = tot = index = 0; 31 mem(Dfn); mem(use); mem(cmp); 32 memset(head, -1, sizeof(head)); 33 } 34 35 void addedge(int u, int v) { 36 e[tot].to = v; 37 e[tot].next = head[u]; 38 head[u] = tot++; 39 } 40 41 void Tarjan(int u) { 42 Low[u] = Dfn[u] = ++index; 43 S.push(u); 44 use[u] = 1; 45 for (int i = head[u]; i != -1; i = e[i].next) { 46 int v = e[i].to; 47 if (!Dfn[v]) { 48 Tarjan(v); 49 Low[u] = min(Low[u], Low[v]); 50 } 51 else if (use[v]) { 52 Low[u] = min(Low[u], Dfn[v]); 53 } 54 } 55 int v; 56 if (Dfn[u] == Low[u]) { 57 k++; 58 do { 59 v = S.top(); 60 S.pop(); 61 cmp[v] = k; 62 use[v] = 0; 63 } while (v != u); 64 } 65 } 66 67 bool check() { 68 for (int i = 0; i < n; i++) { 69 if (map[i][i]) return false; 70 for (int j = i + 1; j < n; j++) 71 if (map[i][j] != map[j][i]) return false; 72 } 73 return true; 74 } 75 76 int main() 77 { 78 while (scanf_s("%d", &n) != EOF) { 79 for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf_s("%d", &map[i][j]); 80 if (!check()) { puts("NO"); continue; } 81 bool flag = false; 82 for (int p = 0; p < 31; p++) { 83 Inite(); 84 for (int i = 0; i < n; i++) { 85 for (int j = i + 1; j < n; j++) { 86 if (i % 2 == 1 && j % 2 == 1) { 87 if ((map[i][j] >> p) & 1) { 88 addedge(i + n, j); 89 addedge(j + n, i); 90 } 91 else { 92 addedge(i, i + n); 93 addedge(j, j + n); 94 } 95 } 96 else if (i % 2 == 0 && j % 2 == 0) { 97 if ((map[i][j] >> p) & 1) { 98 addedge(i + n, i); 99 addedge(j + n, j); 100 } 101 else { 102 addedge(i, j + n); 103 addedge(j, i + n); 104 } 105 } 106 else { 107 if ((map[i][j] >> p) & 1) { 108 addedge(i, j + n); 109 addedge(i + n, j); 110 addedge(j, i + n); 111 addedge(j + n, i); 112 } 113 else { 114 addedge(i, j); 115 addedge(j, i); 116 addedge(i + n, j + n); 117 addedge(j + n, i + n); 118 } 119 } 120 } 121 } 122 for (int i = 0; i < 2 * n; i++) if (!Dfn[i]) Tarjan(i); 123 for (int i = 0; i < n; i++) if (cmp[i] == cmp[i + n]) flag = true; 124 if (flag) break; 125 } 126 if (flag) puts("NO"); 127 else puts("YES"); 128 } 129 return 0; 130 }