Havel-Hakimi 定理:

一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。

例如,判断序列s: 7, 7, 4, 3, 3, 3, 2, 1 是否是可图的。

删除序列s 的首项7,对其后的7 项每项减1,得到:6, 3, 2, 2, 2, 1, 0。

继续删除序列的首项6,对其后的6 项每项减1,得到:2, 1, 1, 1, 0,-1,

到这一步出现了负数。由于图中不可能存在负度数的顶点,因此该序列不是可图的。

再举一个例子,判断序列s: 5, 4, 3, 3, 2, 2, 2, 1, 1, 1 是否是可图的。

删除序列s 的首项5,对其后的5 项每项减1,得到:3, 2, 2, 1, 1, 2, 1, 1, 1,

重新排序后为:3, 2, 2, 2, 1, 1, 1, 1, 1。

继续删除序列的首项3,对其后的3 项每项减1,得到:1, 1, 1, 1, 1, 1, 1, 1。

如此再陆续得到序列:1, 1, 1, 1, 1,1, 0;1, 1, 1, 1, 0, 0;1, 1, 0, 0, 0;0, 0, 0, 0。

由此可判定该序列是可图的。

Havel-Hakimi 定理实际上给出了根据一个序列s 构造图(或判定s 不是可图的)的方法:把序列s 按照非增顺序

排序以后,其顺序为d1, d2, …, dn;度数最大的顶点(设为v1),将它与度数次大的前d1 个顶点之间连边,然

后这个顶点就可以不管了,即在序列中删除首项d1,并把后面的d1个度数减1;再把剩下的序列重新按非增顺序排

序,按照上述过程连边;…;直到建出完整的图,或出现负度数等明显不合理的情况为止。

再回到本题:

Frogs' Neighborhood
Time Limit: 5000MS   Memory Limit: 10000K
Total Submissions: 10443   Accepted: 4340   Special Judge

Description

未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ iN)。如果湖泊LiLj之间有水路相连,则青蛙FiFj互称为邻居。现在已知每只青蛙的邻居数目x1, x2, ..., xn,请你给出每两个湖泊之间的相连关系。

Input

第一行是测试数据的组数T(0 ≤ T ≤ 20)。每组数据包括两行,第一行是整数N(2 < N < 10),第二行是N个整数,x1, x2,..., xn(0 ≤ xiN)。

Output

对输入的每组测试数据,如果不存在可能的相连关系,输出"NO"。否则输出"YES",并用N×N的矩阵表示湖泊间的相邻关系,即如果湖泊i与湖泊j之间有水路相连,则第i行的第j个数字为1,否则为0。每两个数字之间输出一个空格。如果存在多种可能,只需给出一种符合条件的情形。相邻两组测试数据之间输出一个空行。

Sample Input

3
7
4 3 1 5 4 2 1
6
4 3 1 4 2 0
6
2 3 1 1 2 1

Sample Output

YES
0 1 0 1 1 0 1
1 0 0 1 1 0 0
0 0 0 1 0 0 0
1 1 1 0 1 1 0
1 1 0 1 0 1 0
0 0 0 1 1 0 0
1 0 0 0 0 0 0 NOYES
0 1 0 0 1 0
1 0 0 1 1 0
0 0 0 0 0 1
0 1 0 0 0 0
1 1 0 0 0 0
0 0 1 0 0 0

注意:由该定理得到的图是不唯一的。

题解:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define INF
using namespace std;
const int maxn=105;
int t,n;
int e[maxn][maxn];
struct node{int degree;//顶点的度数int num;//顶点的编号
}a[maxn];
bool cmp(node a,node b){//度数由大到小排序return a.degree>b.degree;
}
int main()
{scanf("%d",&t);while(t--){memset(e,0,sizeof e);scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i].degree);a[i].num=i+1;//顶点编号由1-n}int flag=1;//旗帜变量for(int i=0;i<n;i++){sort(a,a+n,cmp);if(a[i].degree>n-i-1){//如果后序顶点的数量小于当前顶点的度数,则无法构成图flag=0;break;}for(int j=i+1;j<=a[i].degree+i&&j<n;j++){a[j].degree--;if(a[j].degree<0){flag=0;break;}e[a[i].num][a[j].num]=e[a[j].num][a[i].num]=1;//连边}}if(flag){printf("YES\n");for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d",e[i][j]);if(j!=n)printf(" ");}printf("\n");}}elseprintf("NO\n");printf("\n");}return 0;
}

POJ 1659【Havel-Hakimi 定理】相关推荐

  1. Havel—Hakimi定理(度序列)

    对于图的所有顶点,我们可以统计出每个顶点的度.像这样的一串数字,我们称之为:度序列.那么反过来,给定一个序列,能否判断这个序列是可图的呢?这里有一个定理:Havel-Hakimi定理可以用来判定一个序 ...

  2. Havel–Hakimi算法学习笔记(哈维尔算法)详细【Python】

    问题 来源离散数学的图论中 第一个接触到的算法:Havel–Hakimi算法 (哈维尔算法) 判断一个非负序列是否为某无向简单图的度数列的方法(Pyhton代码) 前提提要 1.无向简单图 首先先了解 ...

  3. POJ 1265 Area(Pick定理)

    POJ 1265 Area(Pick定理) 根据pick定理来做 皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式该公式可以表示为 2S=2a+b−2 其中a表示多边形内部的点数,b表示多边形边 ...

  4. POJ 1659 Frogs‘ Neighborhood (Havel 定理)

    Havel 定理: 序列的可图:给出一个 由非负整数组成的序列,如果是某个无向图的度序列,则称该序列是可图的. 而 Havel 定理,就是判断序列的可图的方法.先按度数从大到小排序, 每次处理完度数一 ...

  5. poj 1659 Havel-hakimi定理

    题目链接 http://poj.org/problem?id=1659 题意 已知所有顶点的入度,现在问这些顶点是否能构成一张图,如果可以,输出它的邻接矩阵. 题解 Havel-hakimi定理是一个 ...

  6. poj 1265 Area(pick 定理)

    链接:poj 1265 题意:从原点出发.给出一些dx,dy移动增量,终于形成一个多边形, 求多边形内部的格点数目,边上的格点数目 .以及面积. 补充知识: 1.以格子点为顶点的线段.覆盖的点的个数为 ...

  7. POJ 1659 Frogs#39; Neighborhood(度序列组成)

    意甲冠军  中国 依据Havel-Hakimi定理构图即可咯  先把顶点按度数从大到小排序  可图的话  度数大的顶点与它后面的度数个顶点相连肯定是满足的  出现了-1就说明不可图了 #include ...

  8. POJ 1265-Area(计算几何+皮克定理+多边形面积公式)

    题目地址:POJ 1265 题意:给定一个格点多边形,求出内部点数in,边上点数on,和面积S. 思路:运用的定理很多. 1.皮克定理:S=in+on/2-1,即in=(2*S+2-on)/2. 2. ...

  9. POJ 2954-Triangle(计算几何+皮克定理)

    题目地址:POJ 2954 题意:给出三角形的三个顶点,求内部格点的个数. 思路:形同POJ 1265. #include <stdio.h> #include <math.h> ...

最新文章

  1. Cmake 实例学习 一
  2. 英伟达的雄心:成为AI时代的计算平台
  3. “卖我一枝笔”:如何史蒂夫·乔布斯将这一经典问题作出回应?
  4. 较主流的消息队列的比较与选型
  5. 极光尔沃切片软件_极光尔沃3D打印机走进肥东中小学校
  6. 经典排序算法 - 堆排序Heap sort
  7. 重力感应游戏可行性办法研究_完结
  8. 【旧文章搬运】深入分析Win7的对象引用跟踪机制
  9. mysql年龄最大_使用MySQL子查询选择年龄最大的所有用户?
  10. react实现微信分享
  11. matlab中squareg,matlab中y=square(t,DUTY)的用法
  12. 传统企业如何做数字化转型?弄懂这3大底层逻辑你就懂了
  13. 解决使用CSV包,将写入字符串写入csv文件时字符串被拆分成很多单元的问题
  14. Cris 的 Python 数据分析笔记 05:Pandas 数据读取,索引,切片,计算,列整合,过滤,最值
  15. 算法学习之实现二维矩阵的顺时针遍历
  16. B2C大点名:国内B2C网站收集(更新至2009年6月2日)
  17. 股票在不同阶段有哪些卖出技巧?
  18. java ee7 ejb_使用MyEclipse开发Java EE应用:EJB项目开发初探(上)
  19. 使用 adb 对 Android 声音控制全面适配
  20. Android源码50例汇总,欢迎各位下载 【转载自51CTO】

热门文章

  1. 现代机器人学-学习笔记
  2. 双键的Map,Table的rowKey+columnKey+value方法简单应用
  3. 3d建模真的很累吗?前景怎么样
  4. 自定义键盘的布局及实现
  5. what if? serious scientific answers to absurd hypothetical questions
  6. LTE常用定时器参数介绍
  7. 云虚拟主机mysql下载_云虚拟主机如何安装mysql
  8. kodi桌面多媒体系统配置方法
  9. 万国数据、盘古数据、美利云、真视通的共同点是什么?
  10. 数据库|MySQL数据库基础(一)