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 }
原文:http://www.cnblogs.com/zgglj-com/p/8000115.html