pku 1659(判断可图化Havel-Hakiwi定理的应用)

/*
  Name: Havel-Hakiwi定理的应用 
  Copyright: 
  Author: Try86
  Date: 13/04/12 23:16
  Description: 
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

int map[15][15], flag;
struct node {
    int deg; //顶点度数 
    int ver; //顶点编号 
}d[15];


int cmp(const void *a, const void *b) {
    return ((node *)b)->deg - ((node *)a)->deg;
}

void Havel_Hakiwi(int n) {
    for (int i=0; i<n; ++i) {
        qsort(d, n, sizeof(node), cmp);
        int s = d[0].deg;
        d[0].deg = 0;
        if (s > n-i-1) { 
            flag = 0;
            return ;
        }
        for (int j=1; j<=s; ++j) {
            --d[j].deg;
            if (d[j].deg < 0) {
                flag = 0;
                return ;
            }
            map[d[0].ver][d[j].ver] = map[d[j].ver][d[0].ver] = 1;
        }
        if (!flag) return ;
    }
    return ;
}

int main() {
    int t;
    scanf ("%d", &t);
    while (t--) {
        int n;
        scanf ("%d", &n);
        memset(map, 0, sizeof(map));
        for (int i=0; i<n; ++i) {
            scanf ("%d", &d[i].deg);
            d[i].ver = i;
        }
        flag = 1;
        Havel_Hakiwi(n);
        if (flag) {
            printf ("YES\n");
            for (int i=0; i<n; ++i) {
                for (int j=0; j<n; ++j) {
                    if (j) printf (" %d", map[i][j]);
                    else printf ("%d", map[i][j]);
                }
                printf ("\n");
            }
        }
        else printf ("NO\n");
        printf ("\n"); //注意输出一空行,不然判WA,不是PE 
    }
    return 0;    
}

 

posted on 2012-04-14 07:42  Try86  阅读(228)  评论(0)    收藏  举报