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 ;
}
//
#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 ;
}