uva10720 - Graph Construction(图重建)

这道题对我来说,有两个地方是障碍,

第一:

Havel定理

给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化
可图化的判定:d1+d2+……dn=0(mod 2)。关于具体图的构造,我们可以简单地把奇数度的点配对,剩下的全部搞成自环。
可简单图化的判定(Havel定理):把序列排成不增序,即d1>=d2>=……>=dn,则d可简单图化当且仅当d’={d2-1,d3-1,……d(d1+1)-1, d(d1+2),d(d1+3),……dn}可简单图化。简单的说,把d排序后,找出度最大的点(设度为d1),把它与度次大的d1个点之间连边,然后这个点就可以不管了,一直继续这个过程,直到建出完整的图,或出现负度等明显不合理的情况。

第二:

我剪枝剪的不够好。不出所料的碰见了TLE。

代码如下:

#include <cstdio>
#include <cstdlib>
int comp(const void *a, const void *b)
{
    int *aa = (int*)a, *bb = (int*)b;
    return *bb-*aa;
}
int main ()
{
    int n, a[10010], ok;
    while(scanf("%d",&n),n)
    {

        for(int i = 0; i < n; i++)  scanf("%d",&a[i]);
        ok = 1;
        for(int i = 0; ok==1&&i < n; i++)
        {
            qsort(a+i,n-i,sizeof(a[0]),comp);
            if(a[i]>n-i-1) { ok = 0; break;}
            if(a[i]==0) break;
            if(i==n-1) { ok = 0; break;}
            for(int j = i+1; j-i <= a[i]; j++)  if(--a[j]<0) {ok = 0; break; }//需要注意的地方
        }
        if(!ok) puts("Not possible");
        else puts("Possible");
    }
    return 0;
}


你可能感兴趣的:(uva10720 - Graph Construction(图重建))