可图性判定--Havel-Hakimi定理
两个概念
1、度序列
若把图G所有顶点的度数排成一个序列S,则称S为图G的度序列。
2、序列是可图的
一个非负整数组成的序列如果是某个无向图的度序列,则称该序列是可图的。
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个数。
应用:POJ 1659 Frogs' Neighborhood
http://poj.org/problem?id=1659
贴上一个博客
http://blog.csdn.net/monkey_little/article/details/6358601
对于该题目中的第一个序列,分析如下:

具体操作时候,每次都把排序好的序列第一个元素处理完以后就置为0,加入到队列的最后。若是最后元素全为0,则该序列是可图的。若在中间出现某个元素减一之后变为负的,则说明此序列是不可图的。
我的AC代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 10
typedef struct Company
{
int data;
int no;
}Company;
Company x[MAXN];
int map[MAXN][MAXN];
int Compare(const void *elem1, const void *elem2)
{
Company *p1 = (Company*)elem1;
Company *p2 = (Company*)elem2;
// if (p1->data == p2->data)
// {
// return p1->no - p2->no;
// }
return p2->data - p1->data;
}
int main()
{
int T, N;
scanf("%d", &T);
while(T--)
{
scanf("%d", &N);
memset(map, , sizeof(map));
int flag = ;
for (int i = ; i < N; ++i)
{
scanf("%d", &x[i].data);
x[i].no = i;
}
qsort(x, N, sizeof(Company), Compare);
while(!flag && x[].data)
{
int start = x[].data;
for (int i = ; i < start+; ++i)
{
x[i].data--;
if (x[i].data < )
{
flag = ;
break;
}
map[x[].no][x[i].no] = ;
map[x[i].no][x[].no] = ;
}
x[].data = ;
qsort(x, N, sizeof(Company), Compare);
}
if (flag)
{
printf("NO\n");
}else
{
printf("YES\n");
for (int i = ; i < N; ++i)
{
for (int j = ; j < N; ++j)
{
printf(j == ? "%d" : " %d", map[i][j]);
}
printf("\n");
}
}
if (T)
{
printf("\n");
}
}
return ;
}
x.no这个属性用来记录每个输入数据的输入时的编号次序,以用来在map[][]数组填充1时用,否则不知道该x[?][?] = 1;
flag是一个标志位,若中间有负数出现,就改变其值
思路源自以下代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int num,e;
}x[];
bool map[][];
int cmp(node a,node b)
{
if(a.num==b.num)
return a.e<b.e;
return a.num>b.num;
}
int judge(int n)
{
int i,num,tmp;
while(){
sort(x+,x+n+,cmp);
if(!x[].num)
return ;//数组全为 0 的情况退出
for(i=;i<=x[].num+;i++){
if(x[i].num>){
x[i].num--;
map[x[].e][x[i].e]=map[x[i].e][x[].e]=;
}
else
return ;
}
x[].num=;
}
}
int main()
{
int n,t,i,j;
bool flag;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&x[i].num);
x[i].e=i;
}
memset(map,,sizeof(map));
flag=judge(n); if(flag){
printf("YES/n");
for(i=;i<=n;i++){
for(j=;j<=n;j++)
printf(j==?"%d":" %d",map[i][j]);
printf("/n");
}
}
else
printf("NO/n");
if(t)
printf("/n");
}
return ;
}
可图性判定--Havel-Hakimi定理的更多相关文章
- POJ 1659 Frogs' Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 9897 Accepted: 41 ...
- POJ1659 Frogs' Neighborhood(Havel–Hakimi定理)
题意 题目链接 \(T\)组数据,给出\(n\)个点的度数,问是否可以构造出一个简单图 Sol Havel–Hakimi定理: 给定一串有限多个非负整数组成的序列,是否存在一个简单图使得其度数列恰为这 ...
- POJ1659 可图性判定
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10660 Accepted: 4 ...
- HDU 2454"Degree Sequence of Graph G"(度序列可图性判断)
传送门 参考资料: [1]:图论-度序列可图性判断(Havel-Hakimi定理) •题意 给你 n 个非负整数列,判断这个序列是否为可简单图化的: •知识支持 握手定理:在任何无向图中,所有顶点的度 ...
- 弦图的判定MCS算法(zoj1015)
题意:裸的弦图的判定: 弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图: 转载:http://blog.csdn.net/crux_d/ar ...
- Codevs 1702 素数判定 2(Fermat定理)
1702 素数判定 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 一个数,他是素数么? 设他为P满足(P< ...
- HDU6608-Fansblog(Miller_Rabbin素数判定,威尔逊定理应用,乘法逆元)
Problem Description Farmer John keeps a website called ‘FansBlog’ .Everyday , there are many people ...
- UVA10720 Graph Construction 度序列可图性
Luogu传送门(UVA常年上不去) 题意:求一个度序列是否可变换为一个简单图.$\text{序列长度} \leq 10000$ 题目看起来很简单,但是还是有一些小细节需要注意首先一个简单的结论:一张 ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
随机推荐
- Python3 字典 fromkeys()方法
Python3 字典 描述 Python 字典 fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值. 语法 fromkeys()方法语法: ...
- linux下ffmpeg安装(转)
1.ffmpeg下载地址: http://www.ffmpeg.org/download.html 2.解压 1 $ tar xzvf ffmpeg.tar.bz2 这里作者假设已经重命名为ffm ...
- php curl使用ss代理
1.安装 ss,过程略 2.ss 配置文件 { "server":"x.x.x.x", #你的 ss 服务器 ip "server_port" ...
- 巧用Java中Calendar工具类
Java的JDK中提供了一系列好用的util工具类.Calendar就是java.util中用于处理日期的工具类.且该工具类易学易用实用. 工具类Calendar是抽象类. PS:为什么把Calend ...
- 驱动学习3.1:获取zynqled的物理地址
自己想要打印EMIO管脚的物理地址,在SDK提供的头文件中加入printf是无法打印的,基于此 我将需要打印地址的几个函数提取出来,放在main函数中,然后在里面加入printf打印这些用户管脚的地址 ...
- libxml2在mingw下编译
1.配置MingW路径,在环境变量path中加入/mingw32/bin2.解压libxml,进入win32目录3.记事本打开configure.js,找到var compiler = "m ...
- 用CSS3画出一个立方体---转
css3实践—创建3D立方体 要想实现3D的效果,其实非常简单,只需指定一个元素为容器并设置transform-style:preserve-3d,那么它的后代元素便会有3D效果.不过有很多需要注意的 ...
- LightOJ 1070 - Algebraic Problem 推导+矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1070 思路:\({(a+b)}^n =(a+b){(a+b)}^{n-1} \) \(( ...
- net 加密-解密
#region DES加密 解密 //key:32位 public string DESEncrypt(string strSource, byte[] key) { System.Security. ...
- bootstrap-select,selectpicker 用法详细:通过官方文档翻译
用过selectpicker的都说好~但是网上中文的教程又找不到比较完整的用法,于是去官网看了下 顺便弄过来翻译一下: 选项可以通过数据属性或JavaScript传递.对于数据属性,附加选项名称dat ...