Havel-Hakimi定理(握手定理)

news/2024/10/3 19:55:45

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;
}
View Code

 

转载于:https://www.cnblogs.com/zywscq/p/4819978.html


https://dhexx.cn/news/show-16958.html

相关文章

MySQL之索引

1.什么是数据库索引 索引用来快速地寻找那些具有特定值的记录&#xff0c;所有MySQL索引都以B-树的形式保存。如果没有索引&#xff0c;执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录&#xff0c;直至找到符合要求的记录。表里面的记录数量越多&#xff0c;这个操作…

vscode在html看到图片的插件_三个强大的PPT插件工具

今天分享三个强大的PPT插件工具&#xff0c;我知道&#xff0c;很多同学都不需要做很专业的PPT&#xff0c;只要不是太丑&#xff0c;看得过去&#xff0c;直接套用模板就可以了。即使我们自己会做专业的PPT&#xff0c;但是也会偷懒&#xff0c;直接套用模板&#xff0c;差一点…

linux boost 安装

sudo apt-get install libboost-dev 但是&#xff0c;我这样安装以后&#xff0c;编译程序时出现了很多错误&#xff0c;而且都是系统文件的错误。我开始以为是我的boost库版本不对&#xff0c;后来换了好几个版本&#xff0c;都出现了同样的问题。后来&#xff0c;自己编译了…

IOS开发网络篇—数据安全

一、简单说明 1.说明 在开发应用的时候&#xff0c;数据的安全性至关重要&#xff0c;而仅仅用POST请求提交用户的隐私数据&#xff0c;还是不能完全解决安全问题。 如&#xff1a;可以利用软件&#xff08;比如Charles&#xff09;设置代理服务器&#xff0c;拦截查看手机的请…

mysql 查询内存消耗进程_如何查看一个进程消耗多少存储空间,占用多少cpu

1、查看物理CPU数[rootMysqlCluster01 ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l12、查看逻辑CPU数[rootMysqlCluster01 ~]# cat /proc/cpuinfo |grep "processor"|wc -l43、查看CPU几核(即核数)[rootMysqlCluster01 ~]# cat /proc/cpu…

javaweb 图书管理系统完整代码_基于Java web的图书管理系统

源码编号&#xff1a;B-E00029点击查看(分类规则)项目类型&#xff1a;Java EE项目(非开源)项目名称&#xff1a;基于Java web的图书管理系统(library_system)当前版本&#xff1a;V2.0.2版本难度等级&#xff1a;✩✩复杂程度&#xff1a;✩✩ 点击查看难度等级用户类型&#…

python学习笔记24(路径与文件 (os.path包, glob包))

python学习笔记24&#xff08;路径与文件 (os.path包, glob包)&#xff09; os.path模块主要用于文件的属性获取&#xff0c;在编程中经常用到&#xff0c;以下是该模块的几种常用方法。 >>> import os.path >>> path /home/ethon/doc/file.txt >>>…

Effective C++ —— 模板与泛型编程(七)

C templates的最初发展动机很直接&#xff1a;让我们得以建立“类型安全”的容器如vector&#xff0c;list和map。然而当愈多人用上templates&#xff0c;他们发现templates有能力完成愈多可能的变化。容器当然很好&#xff0c;但泛型编程——写出的代码和其所处理的对象类型彼…

代码和普通的java_【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例...

Java中普通代码块&#xff0c;构造代码块&#xff0c;静态代码块区别及代码示例。Java中普通代码块&#xff0c;构造代码块&#xff0c;静态代码块区别及代码示例执行顺序&#xff1a;静态代码块>静态方法(main方法)>构造代码块>构造方法。其中静态代码块在jvm加载类的…

抢红包算法 c++_“抠抠族”的出行利器,斤斤计较的几何C为了节能果然够拼

“勤俭不是小气,浪费也并非大方”,每年的世界节俭日都在号召着人类勤俭节约以共同应对日益严重的资源危机,而节俭落实到现实生活,最简单粗暴的做法就是:省钱!说到省钱,我们不由得想起当下社会中的“抠抠族”。 这个新世代年轻群体虽然爱买买买,但毫不败家,消费还尤其注重性价比…