给定一组非负数字,(数字为节点的度),判断该组数字能不能构成图。

Havel-Hakimi定理:

将序列按照从大到小排序之后,从第二个数开始到第一个数的长度+1为止,依次减1。每操作一次,删掉第一个数字。直到整个数组被删完都没有-1出现。则可图。

按照这个定理,我们可做的操作如下:

1.排序

2.先判断第一个数的度是否大于序列-1的长度,如果大于则非图。

如果小于等于,则后面的数依次减1.小于0,则跳出。

3.存图:循环过程中,如果能减1,则第一个数之后的id都指向第一个数。

实例:

3 1 2 1 1

第一次:3 2 1 1 1           删掉3,后面依次减1

得:1 0 0 1

第二次:1 1 0 0.删掉1,后面依次减1

得:0 0 0

所以可图

代码如下:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct {
int id;
int d;
}Arg; Arg arg[];
int ans[][]; int cmp(const void *a,const void *b){
return ((Arg*)b)->d-((Arg*)a)->d;
}//从大到小 int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
memset(ans,,sizeof(ans));//每一次,将数组置0
for(int i=;i<n;i++){
cin>>arg[i].d;
arg[i].id=i;
}
int k=,i,j;
while(k<n){
qsort(arg+k,n-k,sizeof(arg[]),cmp);//第一次排序后,每次删除第一个数排序
if(arg[k].d>n-k-)
break;//如果当前度数已经大于后面的长度,这说明不可能是图
for(i=;i<=arg[k].d;i++){//次数 if(arg[i+k].d<=)//小于0跳出
break;
arg[i+k].d--;
ans[arg[k].id][arg[k+i].id]=ans[arg[k+i].id][arg[k].id]=;//将后一个数的id,指向前一个数
}
if(i<=arg[k].d)//中途跳出
break;
k++;
}
if(k<n)//没有删完,就跳出了
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(i=;i<n;i++){
for( j=;j<n;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
} }
return ;
}

Havel-Hakimi定理的方法来构图的更多相关文章

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

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

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

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

  3. POJ 1659 Havel-Hakimi定理

    关于题意和Havel-Hakimi定理,可以看看http://blog.csdn.net/wangjian8006/article/details/7974845 讲得挺好的. 我就直接粘过来了 [ ...

  4. poj 1659 Frogs' Neighborhood( 青蛙的邻居)

    Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9639   Accepted: 40 ...

  5. Havel-Hakimi定理(推断是否可图序列)

    给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一相应.则称此序列可图化.进一步.若图为简单图,则称此序列可简单图化 至于能不能依据这个序列构造一个图,就须要依据Havel-H ...

  6. Codeforces 1091E New Year and the Acquaintance Estimation Erdős–Gallai定理

    题目链接:E - New Year and the Acquaintance Estimation 题解参考: Havel–Hakimi algorithm 和 Erdős–Gallai theore ...

  7. 复旦大学2016--2017学年第一学期高等代数I期末考试情况分析

    一.期末考试成绩班级前十名 宁盛臻(100).朱民哲(92).徐钰伦(86).范凌虎(85).沈伊南(84).何陶然(84).丁知愚(83).焦思邈(83).董瀚泽(82).钱信(81) 二.总成绩计 ...

  8. Kolmogorov复杂性

    原文-wiki 看Kolmogorov复杂性看到云里雾里,于是干脆把wiki上的翻译了一下. [toc] Chaitin complexity, algorithmic entropy, progra ...

  9. 现代控制理论习题解答与Matlab程序示例

    现代控制理论习题解答与Matlab程序示例 现代控制理论 第三版 课后习题参考解答: http://download.csdn.net/detail/zhangrelay/9544934 下面给出部分 ...

随机推荐

  1. CSS 水平垂直居中的几种实现方法

    前言 项目中经常碰到需要实现水平垂直居中的样式.下面就总结几种常用的方法 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style> ...

  2. win10自带邮箱添加网易企业邮箱

    开始-邮件-账户-添加账户-高级安装程序-internet电子邮件-然后输入网易企业邮箱的用户名和相关服务器设置就行了 接收服务器 pop.qiye.163.com发送服务器 smtp.qiye.16 ...

  3. 【Nuxt】配置路由

    export default ({store, redirect} => { if (!store.state.username) { redirect('/') } }) vuex 代码处理请 ...

  4. Django的Admin站点管理

    一.概述 内容发布:负责添加.修改.删除内容 公告访问 二.配置Admin应用 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',默认是添 ...

  5. 《Java编程思想第四版》第 16 章 设计范式-提到观察者模式

    在由Gamma,Helm 和 Johnson 编著的<Design Patterns>一书中被定义成一个“里程碑”.那本书列出了解决这个问题的 23 种不同的方法 16.1.2 范式分类 ...

  6. pythonのdjango Session体验

    Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认)缓存文件缓存+数据库加密cookie1.数据库Session Django默认支 ...

  7. ES--07

    61.索引管理_快速上机动手实战创建.修改以及删除索引 课程大纲 1.为什么我们要手动创建索引? 2.创建索引 创建索引的语法 PUT /my_index{ "settings": ...

  8. 【原创】大数据基础之Oozie vs Azkaban

    概括 Azkaban是一个非常轻量的开源调度框架,适合二次开发,但是无法直接用于生产环境,存在致命缺陷(比如AzkabanWebServer是单点,1年多时间没有修复),在一些情景下的行为简单粗暴(比 ...

  9. Python-Django 模型层-多表查询-2

    -related_name:基于双下划线的跨表查询,修改反向查询的字段 -related_query_name:基于对象的跨表查询,修改反向查询字段 publish = ForeignKey(Blog ...

  10. 【sklearn】数据预处理 sklearn.preprocessing

    数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...