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

posted @ 2011-05-30 21:11  张兰云  阅读(269)  评论(0编辑  收藏  举报