Havel-Hakimi定理:
给定一个非负整数序列{d1,d2,...dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化。
题目:http://poj.org/problem?id=1659
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn = 1006;
int n, m, inde, scc_num, res;
int G[maxn][maxn];
struct P
{
int i, num;
bool operator< (P A) const
{
if(num != A.num)
return num > A.num;
return i < A.i;
}
}x[maxn];
bool check()
{
for(int i = 0; i < n - 1; i++)
{
sort(x + i, x + n);
if(x[i].num + i >= n)
return false;
for(int j = i + 1; j <= i + x[i].num; j++)
{
x[j].num--;
if(x[j].num < 0) return false;
G[x[i].i][x[j].i] = 1;
G[x[j].i][x[i].i] = 1;
}
}
if(x[n - 1].num != 0)
return false;
return true;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while(T--)
{
cin >> n;
for(int i = 0; i < n; i++)
cin >> x[i].num, x[i].i = i;
memset(G, 0, sizeof(G));
if(check())
{
cout << "YES" << endl;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
cout << G[i][j] << (j == n - 1 ? '\n' : ' ');
}
}
else
cout << "NO" << endl;
cout << endl;
}
return 0;
}