Havel算法的简单思想:
(1)对序列从大到小排序
(2)设最大的度数为t,把最大的度数置为0,然后(不包括自己)的t个度数分别减一,就是让第一个与后几个相连,
(3)如果序列中出现了负数,证明无法构成。如果序列全为零,证明能构成跳出循环。
4 4 3 3 2 2
第二步后 0 3 2 2 1 2
排序 3 2 2 2 1 0
第三步后 0 1 1 1 1 0
排序 1 1 1 1 0 0
第二步后 0 0 1 1 0 0
排序 1 1 0 0 0 0
第二步后 0 0 0 0 0 0
全零,能构成图,跳出!
出现负数,直接跳出
// 1659.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int ID;
int num;
};
int cmp(node &c,node &d)
{
return c.num>d.num;
}
int main()
{
int testcase;
cin>>testcase;
bool flag;
while(testcase--)
{
flag=true;
int n;
cin>>n;
int a[15][15];
node b[25];
memset(a,0,15*15*sizeof(a[0][0]));
for(int i=1;i<=n;i++){
cin>>b[i].num;
b[i].ID=i;
}
sort(b+1,b+n+1,cmp);
//for(int i=1;i<=n;i++)
// cout<<b[i].num<<endl;
//getchar();
/*if(b[1].num==0&&b[n].num==0){
cout<<"NO"<<endl;
cout<<endl;
flag=false;
continue;
}*/
while(b[1].num!=0)
{
for(int i=2;i<b[1].num+2;i++)
{
b[i].num-=1;
a[b[i].ID][b[1].ID]=1;
a[b[1].ID][b[i].ID]=1;
}
b[1].num=0;
sort(b+1,b+n+1,cmp);
if(b[n].num<0){
cout<<"NO"<<endl;
flag=false;
cout<<endl;
break;
}
}
if(flag==true)
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
}
system("pause");
return 0;
}