利用Havel-Hakami定理判定是否可图,并构建一个可行解。要是不知道这个定理的话多半是要深搜了吧,还不会这个姿势。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <utility>
#include <stack>
#include <functional>
using namespace std;
typedef long long lovelive;
const int inf = INT_MAX;
const double pai = acos(-1.0);
const double gold = (sqrt(5.0) - 1.0) / 2.0;
int ans_arr[20][20], mir_arr[20], n;
bool flag;
struct frog
{
int num; int no;
};
frog base_arr[20];
bool cmp(frog a, frog b)
{
return a.num > b.num;
}
bool cmp2(int a, int b)
{
return a > b;
}
void init()
{
flag = true;
memset(ans_arr, 0, sizeof(ans_arr));
memset(base_arr, 0, sizeof(base_arr));
memset(mir_arr, 0, sizeof(mir_arr));
return ;
}
void input_data()
{
int i, j, k;
scanf("%d", &n);
for(i = 0; i < n; ++i)
{
scanf("%d", &base_arr[i].num);
base_arr[i].no = i;
mir_arr[i] = base_arr[i].num;
}
sort(base_arr, base_arr + n, cmp);
return ;
}
bool judge()
{
int i, j, k;
sort(mir_arr, mir_arr + n, cmp2);
k = mir_arr[0];
mir_arr[0] = 0;
for(i = 1; i <= k; ++i)
{
mir_arr[i] -= 1;
if(mir_arr[i] < 0)
{
return false;
}
}
return true;
}
void solve()
{
int i, j, k;
for(i = 1; i <= n; ++i)
{
if(!judge() == true)
{
flag = false;
printf("NO\n");
return ;
}
}
return ;
}
void output_data()
{
int i, j, k;
if(!flag == true) return ;
printf("YES\n");
for(i = 0; i < n; ++i)
{
sort(base_arr, base_arr + n, cmp);
k = base_arr[0].num, base_arr[0].num = 0;
for(j = 1; j <= k; ++j)
{
base_arr[j].num -= 1;
ans_arr[base_arr[0].no][base_arr[j].no] = ans_arr[base_arr[j].no][base_arr[0].no] = 1;
}
}
for(i = 0; i < n; ++i)
{
for(j = 0; j < n; ++j)
{
if(j != 0) printf(" ");
printf("%d", ans_arr[i][j]);
}
printf("\n");
}
return ;
}
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
//#endif // ONLINE_JUDGE
int i, j, k;
int t;
while(scanf("%d", &t) != EOF)
{
for(int cse = 1; cse <= t; ++cse)
{
if(cse != 1)
{
printf("\n");
}
init();
input_data();
solve();
output_data();
}
}
return 0;
}