POJ

来源:互联网 发布:windows.h在哪 编辑:程序博客网 时间:2024/06/16 08:38

可简单图化的判定(Havel定理): 把序列排成不增序,即d1>=d2>=……>=dn,则d可简单图化当且仅当d’={d2-1,d3-1,……d(d1+1)-1, d(d1+2),d(d1+3),……dn}可简单图化. 简单的说,把d排序后,找出度最大的点(设度为d1),把它后面的d个数依次连边,然后这个点就可以不管了(然后这个数–),一直继续这个过程,直到建出完整的图,或出现负度等明显不合理的情况.
不合理的情况大概有两种: 一是中间出现负度的情况, 二是出现某个数后面的个数小于这个数.
那么直接根据这个定理就可以直接写了.

AC Code

/** @Cain*/const int maxn = 15+5;int cas=1;int a[maxn][maxn];struct node{    int id,w;}s[maxn];bool cmp(node a,node b){    return a.w>b.w;}void solve(){    int n; scanf("%d",&n);    //printf("%d\n",n);    Fill(a,0);    for(int i=0;i<n;i++) {        scanf("%d",&s[i].w);        s[i].id = i ;    }    int flag = 1;    for(int i=0;i<n && flag;i++){        sort(s+i,s+n,cmp);        if(s[i].w > n-i-1) flag = 0;        for(int j=i+1;j<=i+s[i].w;j++){            s[j].w--;            if(s[j].w<0) flag = 0;            a[s[i].id][s[j].id] = 1;            a[s[j].id][s[i].id] = 1;        }    }    if(!flag) puts("NO");    else{        puts("YES");        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                printf("%d%c",a[i][j],j==n-1?'\n':' ');            }        }    }}
原创粉丝点击