Havel-Hakimi定理(握手定理)

由非负整数组成的非增序列s(度序列):d1,d2,…,dn(n>=2,d1>=1)是可图的,当且仅当序列:

s1:d2 – 1,d3 – 1,…,dd1+1 – 1,dd1+2,…,dn

是可图的。序列s1中有n-1个非负整数,s序列中d1后的前d1个度数(即d2~dd1+1)减1后构成s1中的前d1个数。

说白了就是先把第一个点(度数为d1)连线到后面d1个点,保证第一个点度数满足,然后再以此类推考虑后面的点。如果后面所有顶点满足并且度数不多不少(最后不剩,过程中没有度数为负数),即可认为,度序列是可图的。

为什么每一次都要排成非递增序列后再操作?因为这样是最好判断的,最后都成0就可图,中途出现负数就不可图。如果不排成非递增就不好判断了,比如最后0,1,0,1是可图的;0,2,0,2不可图,还有各种最终情况,很难写代码去判断可图不可图。

由同一个可图序列构造出来的图不一定是唯一的。

例题poj1659

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const double eps=1e-10;
const int INF=1000000000;
const int maxn=10+3;

int ans[maxn][maxn];
int T,n;
struct node
{
    int id,de;
} x[maxn];

bool cmp(node a,node b)
{
    return a.de>b.de;
}

int main()
{
    //freopen("in1.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&x[i].de);
            x[i].id=i+1;
        }
        memset(ans,0,sizeof(ans));
        int tn=n;
        bool can=1;
        while(tn>0)
        {
            sort(x,x+n,cmp);
            if(x[0].de==0) break;
            for(int i=1; i<=x[0].de; i++)
            {
                if(x[i].de>0&&i<n)
                {
                    x[i].de--;
                    ans[x[0].id][x[i].id]=ans[x[i].id][x[0].id]=1;
                }
                else
                {
                    can=false;
                    break;
                }
            }
            if(can==false) break;
            x[0].de=0;
            tn--;
        }
        if(can==true)
        {
            puts("YES");
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(j==1)    printf("%d",ans[i][j]);
                    else   printf(" %d",ans[i][j]);
                }
                puts("");
            }
        }
        else puts("NO");
        if(T>=1) puts("");
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

时间: 2024-11-14 01:51:44

Havel-Hakimi定理(握手定理)的相关文章

图论——握手定理

这是一个非常重要的图论定理在多出用到: 握手定理: 在任何有向图图中,所有顶点的度数之和等于边数的2倍,所有顶点的入度之和等于所有顶点出度之和,等于边数 无向简单图,同样所有顶点的度数之和等于边数的2倍 原文地址:https://www.cnblogs.com/dugudongfangshuo/p/10142034.html

一阶非线性常微分方程解的存在性定理—Picard-Lindelof定理

上一节简单介绍了可求解的一阶常微分方程的解法,因为大部分非线性方程是不可解的,所以需要给出解的存在性的证明.本节主要介绍一阶非线性常微分方程Cauchy问题$$(E)\,\,\,\,\,\frac{dy}{dx}=f(x,y),\,\,\,\,\,y(x_{0})=y_{0}.$$解的存在性定理Picard-Lindelof定理(有的书上称它为Cauchy-Lipschitz定理). 对一阶常微分方程解的存在性理论作出重要贡献的数学家有Cauchy.Lipschitz.Picard.Lindel

CSU 1805 Three Capitals(矩阵树定理+Best定理)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1805 题意: A和B之间有a条边,A和G之间有b条边,B和G之间有c条边.现在从A点出发走遍所有的边,然后再回到A点,问一共有多少种方法. 思路: 16年湖南省赛题目,这道题目是求欧拉回路的个数,和生成树的计数有一定的联系. 首先给出神奇的Best定理,这是什么鬼定理,反正查不到什么有关该定理的文章... $ec(G)=t_s(G)\cdot deg(s)! \cdot \prod_{v\i

[bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT

Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃

Havel–Hakimi algorithm(判断度数序列是否可图)

问题 J: Degree Sequence of Graph G 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Wang Haiyang is a strong and optimistic Chinese youngster. Although born and brought up in the northern inland city Harbin, he has deep love and yearns for the boundless oceans. After gr

【离散数学2】代数系统与图论个人总结

代数系统部分 基础定理 鸽巢原理 群论 广群 半群 独异点 群 群的阶数与元素的阶数 陪集与拉格朗日定理 特殊群 交换/阿贝尔群 循环群 sylow定理 环与域 环 整环 域 格论 格 分配格 模格 有界格 补格 图论部分 基础定理 握手定理 握手定理,有n个人握手,每人握手x次,握手总次数为S= nx/2. 推出 图的度与边数的关系 基础概念 路 节点与相邻的边交替出现 v0e1v1e2...vn-1envn 回路  v0=vn的路//某教材虽然这么写 但题出的都是欧拉回路呵呵 通路 圈 迹

cdoj913-握手 【Havel定理】

http://acm.uestc.edu.cn/#/problem/show/913 握手 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 一群人参加了一次聚会,其中有一些人是好朋友.一对朋友见面后握手且仅握一次手,并且每个人不会和自己握手(废话!).现在告诉你每个人一共握了几次手,请你判断是否存在一种朋友关系满足每个人的握手数. Input 输入多

POJ 1659 Frogs&#39; Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】

Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9897   Accepted: 4137   Special Judge Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和Fj互称为邻居.现在已知每只青蛙的邻居数目x1, x2, ..

棋盘的多米诺覆盖:Dimer Lattice Model,Pfaff 多项式,Kasteleyn 定理

这次来介绍计数组合学里面一个经典的问题:Dimer Lattice Model.问题是这样的:一个有 64 个方格的国际象棋棋盘,有多少种不同的多米诺骨牌覆盖?这里的覆盖是指不重复不遗漏地盖住整个棋盘. 下图是一种可能的覆盖方式(图片来自 Wiki 百科): 这个问题的答案是 12988816,非常大的一个数字,绝对不是一个一个数出来的.1961 年德国物理学家 Kasteleyn 借助于线性代数中的一个结论首先解决了这个问题,我们接下来就介绍他的方法. ~~~~~~~~~~~~~~~~~~~~