poj 1659

嘿嘿嘿,我又回来写题解了。

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

睡觉,世界晚安

你可能感兴趣的:(poj)