可图性判定—Havel-Hakimi定理(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/archive/2012/08/11/2633730.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值