可图性判定—HavelHakimi定理(POJ 1659)

 Havel—Hakimi定理:由非负数组成的非增序列s:d1,d2,···,dn(n>=2,d1>=1)是可图的,当仅当序列

                  s1d2-1d3-1,···,dd1+1 -1,dd1+2,····,dn

是可图的。序列s1中有n-1个非负数,s序列中d1后的前d1个度数减1后构成s1中的前d1个数。

 判定过程:(1)对当前数列排序,使其呈递减

                  (2)从S【2】开始对其后S【1】个数字-1

                  (3)一直循环直到当前序列出现负数(即不是可图的情况)或者当前序列全为0 (可图)时退出。

例题:POJ 1659 Frogs' Neighborhood

 

代码: 

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 const int N=16;
 7 struct node
 8 {
 9     int degree;//顶点的度数
10     int index;//顶点的序号
11 }p[N];
12 int cmp(const void *a,const void *b)
13 {
14     return ((struct node *)b)->degree-((struct node *)a)->degree;
15 }
16 int main()
17 {
18     int t,n,i,j,k,flag;
19     int map[N][N];
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%d",&n);
24         for(i=0;i<n;i++)
25         {
26             scanf("%d",&p[i].degree);
27             p[i].index=i;
28         }
29         memset(map,0,sizeof(map));
30         flag=1;
31         for(j=0;j<n&&flag;j++)
32         {
33             qsort(p+j,n-j,sizeof(p[0]),cmp);//对p数组后n-j个元素排序
34             i=p[j].index;
35             int d=p[j].degree;
36             if(d>n-j-1)
37                 flag=0;
38             for(k=1;k<=d&&flag;k++)
39             {
40                 int jj=p[j+k].index;
41                 if(p[j+k].degree<=0)
42                     flag=0;
43                 p[j+k].degree--;
44                 map[i][jj]=map[jj][i]=1;
45             }
46         }
47         if(flag)
48         {
49             puts("YES");
50             for(i=0;i<n;i++)
51             {
52                 for(j=0;j<n;j++)
53                 {
54                     if(j)
55                         printf(" ");
56                     printf("%d",map[i][j]);
57                 }
58                 puts("");
59             }
60         }
61         else
62             puts("NO");
63         if(t)
64             puts("");
65     }
66 }
原文地址:https://www.cnblogs.com/pony1993/p/2633730.html