http://poj.org/problem?id=1659

定理:1,先把点的度按照递减(可以等于)顺寻排列;

2,然后 把第一个点的度计为n,以后的n个数都减去1,

3,然后排序,把第二个点的度计做你,以后n个数都减去1;

4,到出现-1时,为否,都为0时,为是;

还有一种条件为:如果n大于等于后面点的数时,也为否,

我就错在了这个地方

一下为我的代码

#include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<math.h>
 #include<iostream>
 #include<algorithm>
 using namespace std;


 struct ele
 {
     int W;
     int V;
 }p[25];


 bool cmp(ele x,ele y)
 {
     return x.W>y.W;
 }


 int main()
 {
     bool mark=false;
     int mat[25][25];
     int i,j,k;
     int T;
     int n;
     int flag;
     scanf("%d",&T);
     while(T--)
     {
         memset(mat,0,sizeof(mat));
         flag=false;
         scanf("%d",&n);
         for(i=0;i<n;i++)
         {
             scanf("%d",&p[i].W);
             p[i].V=i;
         }
         for(i=0;i<n;i++)
         {
             sort(p+i,p+n,cmp);
             for(j=i+1;j<=i+p[i].W;j++)
             {
                 k=n-i;
                 if(p[j].W>=k)
                 {
                     flag=true;
                     break;
                 }
                 p[j].W--;
                 mat[p[i].V][p[j].V]=mat[p[j].V][p[i].V]=1;
                 if(p[j].W<0)
                 {
                     flag=true;
                     break;
                 }


             }
             if(flag)
                 break;
         }
         if(mark)
             printf("\n");
         else
             mark=true;
         if(flag)
             printf("NO\n");
         else
         {
             printf("YES\n");
             for(i=0;i<n;i++)
                 for(j=0;j<n;j++)
                     if(j==n-1)
                         printf("%d\n",mat[i][j]);
                     else
                         printf("%d ",mat[i][j]);
         }
     }
     return 0;
 }