zoukankan      html  css  js  c++  java
  • 可图性判定—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 }
  • 相关阅读:
    连载:面向对象葵花宝典:思想、技巧与实践(2)
    关于虚拟化一些思考——不应该盲目使用
    Zimbra8.x邮件服务器安装及配置
    CodeForces 371D. Vessels
    【建模】UML类关系分析
    公式提取软件mathpix
    ROS多线程编程
    ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle
    ROS 日志消息(C++)
    Python 中的 if __name__ == '__main__' 该如何理解
  • 原文地址:https://www.cnblogs.com/pony1993/p/2633730.html
Copyright © 2011-2022 走看看