嘿嘿嘿,我又回来写题解了。
today 传送 1659
今天是一个神奇~的定理。。大概他的名字叫额、、
HAVEL可图定理。
就是给你一组度,让你判断可图否?
Havel-Hakimi定理的内容可百度之。
Havel-Hakimi定理很容易理解:
三步走就可以了:。
排序,删边,减1
下面举一个例子:
已经排序:
5433222111.
删除第一个数5:
433222111.
把前面5个数减1:
322112111
排序:
322211111.
删除第一个数3:
22211111.
把前面3个数减1:
11111111.
排序:
11111111.
删除第一个数1:
1111111.
把前面1个数减1:
0111111.
排序:
1111110
删除第一个数1:
111110
把前面1个数减1:
011110
排序:
111100
依此类推:到最后只剩下:
0000
由此判断该序列是可图的。
so 代码
但是注意:
1.格式的\n,WA一次
2YES,NO ,WA一次
3.和样例不一样没关系,毕竟specialjudge
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t,n,ans[11][11];
struct node{
int id,num;
}frog[11];
int cmp(node a,node b){
return a.num>b.num;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&frog[i].num);
frog[i].id=i;
}
memset(ans,0,sizeof(ans));
bool jy=0;
for(int i=1;i<=n;i++)
{
sort(frog+i,frog+n+1,cmp);
if(frog[i].num == 0) {
jy=0;break;
}
if(frog[i].num>n-i){
jy=1;break;
}
for(int j=i+1;j<=i+frog[i].num;j++){
frog[j].num--;
if(frog[j].num<0){
jy=1;break;
}
ans[frog[i].id][frog[j].id]=ans[frog[j].id][frog[i].id]=1;
}
if(jy == 1) break;
frog[i].num=0;
}
if(jy == 0){
printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j!=1){
printf(" ");
}printf("%d",ans[i][j]);}
printf("\n");}
}
else{
printf("NO\n");}
printf("\n");}
}
睡觉,世界晚安