#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define MAXN 30
using namespace std;
struct Node {
int degree; /* 度数 */
int index; /* 序号 */
};
Node a[MAXN];
int ans[MAXN][MAXN];
int cmp(Node a, Node b) {
return a.degree > b.degree;
}
int Havel(int lo, int hi) { /* [lo, hi) */
sort(a + lo, a + hi, cmp);
int odd_cnt = 0;
int allzero = 0;
for (int i = lo; i < hi; ++i) {
if (a[i].degree % 2) ++odd_cnt;
if (a[i].degree == 0) ++allzero;
}
if (odd_cnt % 2) return 0; /* 1、奇数度的点不能为偶数个 */
if (a[lo].degree > hi - lo - 1) return 0; /* 2、最大度数大于剩下的n - 1个点,不可简单图化 */
if (allzero == hi - lo) return 1; /* 最后全为0,就是可简单图化*/
int x = (int)a[lo].degree;
for (int i = lo + 1; i <= x + lo; ++i) {
--a[lo].degree;
--a[i].degree;
ans[a[lo].index][a[i].index] = 1; /*构建简单图*/
ans[a[i].index][a[lo].index] = 1;
if (a[i].index < 0) return 0;
}
int ok = Havel(lo + 1, hi);
return ok;
}
void Print(int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%d", ans[i][j]);
if (j != n - 1) printf(" ");
}
puts("");
}
}
int main() {
int n, t;
scanf("%d", &t);
while (t--) {
memset(ans, 0, sizeof(ans));
memset(a, 0, sizeof(a)); /* 记得初始化数组a */
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i].degree);
a[i].index = i;
}
if (Havel(0, n) == 1) {
printf("YES\n");
Print(n);
}
else
printf("NO\n");
if (t != 0) puts("");
}
return 0;
}
Havel_Theorem
最新推荐文章于 2022-04-05 10:19:52 发布