poj 1659

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

你可能感兴趣的:(poj)