题意:给你一个度序列,判断是否可以建图,若可以建图则输出”YES“并把图的邻接矩阵输出,否则输出“NO”。
思路:Havel-Hakimi定理,在判断的过程中建图。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
int index;
int degree;
};
node a[15];
int n;
bool graph[15][15];
bool cmp(const node &a, const node &b){
return a.degree > b.degree;
}
void input(){
cin>>n;
for(int i = 0; i < n; i++){
cin>>a[i].degree;
a[i].index = i;
}
memset(graph,0,sizeof(graph));
}
bool check(){
for(int i = 0; i < n; i++){
sort(a+i,a+n,cmp);
int d = a[i].degree;
if(i+d >= n)
return false;
for(int j = i+1; j <= i+d; j++){
a[j].degree--;
if(a[j].degree < 0)
return false;
graph[a[i].index][a[j].index] = 1;
graph[a[j].index][a[i].index] = 1;
}
}
return true;
}
void graph_print(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(j)
cout<<" ";
cout<<" "<<graph[i][j];
}
cout<<"\n";
}
}
int main(){
int t;
cin>>t;
while(t--){
input();
if(check()){
cout<<"YES\n";
graph_print();
}
else
cout<<"NO\n";
if(t)
cout<<"\n";
}
return 0;
}