两个概念

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定理的更多相关文章

  1. POJ 1659 Frogs' Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9897   Accepted: 41 ...

  2. POJ1659 Frogs' Neighborhood(Havel–Hakimi定理)

    题意 题目链接 \(T\)组数据,给出\(n\)个点的度数,问是否可以构造出一个简单图 Sol Havel–Hakimi定理: 给定一串有限多个非负整数组成的序列,是否存在一个简单图使得其度数列恰为这 ...

  3. POJ1659 可图性判定

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10660   Accepted: 4 ...

  4. HDU 2454"Degree Sequence of Graph G"(度序列可图性判断)

    传送门 参考资料: [1]:图论-度序列可图性判断(Havel-Hakimi定理) •题意 给你 n 个非负整数列,判断这个序列是否为可简单图化的: •知识支持 握手定理:在任何无向图中,所有顶点的度 ...

  5. 弦图的判定MCS算法(zoj1015)

    题意:裸的弦图的判定: 弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图: 转载:http://blog.csdn.net/crux_d/ar ...

  6. Codevs 1702 素数判定 2(Fermat定理)

    1702 素数判定 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 一个数,他是素数么? 设他为P满足(P< ...

  7. HDU6608-Fansblog(Miller_Rabbin素数判定,威尔逊定理应用,乘法逆元)

    Problem Description Farmer John keeps a website called ‘FansBlog’ .Everyday , there are many people ...

  8. UVA10720 Graph Construction 度序列可图性

    Luogu传送门(UVA常年上不去) 题意:求一个度序列是否可变换为一个简单图.$\text{序列长度} \leq 10000$ 题目看起来很简单,但是还是有一些小细节需要注意首先一个简单的结论:一张 ...

  9. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

随机推荐

  1. MySQL中文全文检索demoSQL

    一.概述      MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度. 二.语法      MATCH (col1,col2,...) AGAINS ...

  2. Hive(三)hive的高级操作

    一.hive的各种join操作 语法结构:join_table:table_reference JOIN table_factor [join_condition]| table_reference ...

  3. PID控制算法的C语言实现十一  模糊算法简介

    在PID控制算法的C语言实现九中,文章已经对模糊PID的实质做了一个简要说明.本来打算等到完成毕业设计,工作稳定了再着力完成剩下的部分.鉴于网友的要求和信任,抽出时间来,对模糊PID做一个较为详细的论 ...

  4. 13.UiAutomator 辅助APK的使用

    一.在测试中弹出提示框 UiAutomator无法直接实现,,但是可以通过让辅助APK接受UiAutomator发送的指令信息来实现,使用am命令 实例: 1.新建辅助apk,用来接收Uiautoma ...

  5. find~~~查找文件

    find . -name "klibc" 在当前文件内查找文件 klibc find . -name "*libc*" 在当前文件内查找文件 (模糊查询)

  6. duilib 修复padding属性导致其他控件自动计算宽高度错误的bug和导致自己宽高度错误的bug

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42950733          BUG 一:padding导致其他控件宽 ...

  7. 第1章-初识Vue.js

    一.初识Vue 1.1.本次我们学习的内容 常用指令:vue中最基础的内容 交互: 网络请求 组件: 是vue.js 这个框架 最核心,最精华的内容,因为vue呐,它在所有的框架中是把组件化做到了极致 ...

  8. 数学&模拟:随机化-矩阵随机化

    BZOJ2396 给出三个行数和列数均为N的矩阵A.B.C,判断A*B=C是否成立 随机生成一个N乘1的矩阵R 然后判断A*B*R是否等于C*R,而前者相当于A*(B*R) 与后者一样都可以在O(N2 ...

  9. jQuery各版本CDN

    jquery-2.1.1 注:jquery-2.0以上版本不再支持IE 6/7/8)百度引用地址 (推荐目前最稳定的,不会出现延时打不开情况) 百度压缩版引用地址:<script src=”ht ...

  10. elasticsearch创建索引

    1.通过elasticsearch-head 创建 (1)登录localhost:9100 (2)点击复合查询 (3)输入内容 (4)勾选易读,点击验证是否是JSON格式 (5)点击提交请求,返回 { ...