这道题对我来说,有两个地方是障碍,
第一:
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;
}