可图性判定--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 ...
随机推荐
- 第一个python程序(2)
输入和输出 输出 用print加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' pr ...
- 洛谷 P1410 子序列(DP)
这题的题解的贪心都是错误的...正解应该是个DP 考虑有哪些有关的条件:两个序列的当前长度, 两个序列的末尾数, 把这些都压进状态显然是会GG的 考虑两个长度加起来那一位的数一定是其中一个序列的末尾, ...
- Spring MVC 向前台页面传值-ModelAndView
ModelAndView 该对象中包含了一个model属性和一个view属性 model:其实是一个ModelMap类型.其实ModelMap是一个LinkedHashMap的子类 view:包含了一 ...
- Codeforces Round #410 (Div. 2)A B C D 暴力 暴力 思路 姿势/随机
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- python学习笔记(三)高级特性
一.切片 list.tuple常常截取某一段元素,截取某一段元素的操作很常用 ,所以python提供了切片功能. L=['a','b','c','d','e','f'] #取索引0,到索引3的元素,不 ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- [吴恩达机器学习笔记]12支持向量机6SVM总结
12.支持向量机 觉得有用的话,欢迎一起讨论相互学习~Follow Me 12.6SVM总结 推荐使用成熟的软件包 用以解决 SVM 最优化问题的软件很复杂,且已经有研究者做了很多年数值优化.因此强烈 ...
- 跟我一起写Makefile(四)
书写命令———— 每条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的.在命令行之 ...
- Python学习笔记(九)返回函数
摘抄:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318352367 ...
- Linux高级编程--01.vi命令
VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠 ...