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

转载于:https://www.cnblogs.com/zhanglanyun/archive/2011/05/30/2063641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值