Degree Sequence of Graph G(Havel-Hakimi定理)

2024-01-10 17:38

本文主要是介绍Degree Sequence of Graph G(Havel-Hakimi定理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接

Problem Description

Wang Haiyang is a strong and optimistic Chinese youngster. Although born and brought up in the northern inland city Harbin, he has deep love and yearns for the boundless oceans. After graduation, he came to a coastal city and got a job in a marine transportation company. There, he held a position as a navigator in a freighter and began his new life.
The cargo vessel, Wang Haiyang worked on, sails among 6 ports between which exist 9 routes. At the first sight of his navigation chart, the 6 ports and 9 routes on it reminded him of Graph Theory that he studied in class at university. In the way that Leonhard Euler solved The Seven Bridges of Knoigsberg, Wang Haiyang regarded the navigation chart as a graph of Graph Theory. He considered the 6 ports as 6 nodes and 9 routes as 9 edges of the graph. The graph is illustrated as below.在这里插入图片描述

According to Graph Theory, the number of edges related to a node is defined as Degree number of this node.
Wang Haiyang looked at the graph and thought, If arranged, the Degree numbers of all nodes of graph G can form such a sequence: 4, 4, 3,3,2,2, which is called the degree sequence of the graph. Of course, the degree sequence of any simple graph (according to Graph Theory, a graph without any parallel edge or ring is a simple graph) is a non-negative integer sequence?
Wang Haiyang is a thoughtful person and tends to think deeply over any scientific problem that grabs his interest. So as usual, he also gave this problem further thought, As we know, any a simple graph always corresponds with a non-negative integer sequence. But whether a non-negative integer sequence always corresponds with the degree sequence of a simple graph? That is, if given a non-negative integer sequence, are we sure that we can draw a simple graph according to it.?
Let’s put forward such a definition: provided that a non-negative integer sequence is the degree sequence of a graph without any parallel edge or ring, that is, a simple graph, the sequence is draw-possible, otherwise, non-draw-possible. Now the problem faced with Wang Haiyang is how to test whether a non-negative integer sequence is draw-possible or not. Since Wang Haiyang hasn’t studied Algorithm Design course, it is difficult for him to solve such a problem. Can you help him?

Input

The first line of input contains an integer T, indicates the number of test cases. In each case, there are n+1 numbers; first is an integer n (n<1000), which indicates there are n integers in the sequence; then follow n integers, which indicate the numbers of the degree sequence.

Output

For each case, the answer should be "yes"or “no” indicating this case is “draw-possible” or “non-draw-possible”

Sample Input

2
6 4 4 3 3 2 2
4 2 1 1 1

Sample Output

yes
no

单词:

  • inland city 内陆城市
  • coastal city 沿海城市
  • yearn 向往
  • boundless 无限的
  • marine transportation company 海运公司
  • navigator 航海家
  • freighter 货轮
  • sail = navigate 航行
  • port = harbor 港口
  • At the first sight of 乍一看
  • sequence 顺序,序列
  • degree sequence 度序列
  • corresponds with 对应于

原文翻译:

王海洋是一个坚强而乐观的中国年轻人。 尽管他在北方内陆城市哈尔滨出生并长大,但他对无限的海洋有着深切的爱慕和向往。毕业后,他来到一个沿海城市,并在一家海上运输公司找到了工作。 在那儿,他担任一艘货轮的航海家,开始了他的新生活。
王海洋的货轮在6个港口之间航行,这些港口之间存在9条路线。乍一看他的导航图上的6个端口和9条路线,使他想起了他在大学学习的图论。他将6个港口视为6个节点,将9条路线视为图的9条边。
根据图论,将与节点有关的边数定义为该节点的度数。
王海洋看了看图,想到了如果安排得好,图G的所有节点的度数就可以形成这样的序列:4、4、3、3、2、2,称为图的度数序列。 当然,任何简单图的度序列(根据图论,没有任何平行边或环的图都是简单图)是非负整数序列。
王海洋是一个有思想的人,并且倾向于对任何引起他兴趣的科学问题进行深入思考。因此,像往常一样,他还对这个问题作了进一步的思考:众所周知,任何一个简单的图总是与一个非负整数序列相对应。但是,一个非负整数序列是否始终对应于一个简单图的度数序列?也就是说,如果给定一个非负整数序列,我们是否可以根据它绘制一个简单的图?
让我们提出这样一个定义:假设一个非负整数序列是没有任何平行边或环的图(即简单图)的度数序列,则该序列是可图的,否则是不可图的 。 现在,王海洋所面临的问题是如何测试非负整数序列是否可图。 由于王海洋没有学习算法设计课程,因此他很难解决这个问题。 你能帮他吗?

题意分析:

判断一个序列是否可图,即可图性判定。

Havel-Hakimi定理及相关概念介绍:

  • 度序列:若把图G所有顶点的度数(入度 + 出度)排成一个序列S,则称S为图G的度序列。
  • 序列是可图的:一个非负整数组成的有限序列如果是某个无向图(图可以连通,也可以不连通)的度序列,则称该序列是可图的。
  • 定理主要用来判定一个给定的序列是否是可图化的(可图:按照该度数序列,可以画出一个无向图)
  • Havel-Hakimi定理的判定过程:
    对当前数列S排序,使其呈递减(非递增)
    删除S[1],从S[2]开始对其后S[1]个数字,每个数字都进行减1操作
    每次减1操作执行完毕,需要重新对序列进行递减排序
    循环以上步骤
    在某次循环中当前序列出现负数即该序列不可图
    在某次循环中当前序列全为0即该序列可图

Havel-Hakimi算法核心代码:

bool Havel_Hakimi(int nums[])
{for(int i = 0;i < n;i++){  sort(nums + i,nums + n,cmp);//每次都需要从第i个元素开始非递增排序 if(i + nums[i] >= n) return false;//若第i个元素 + nums[i]的值超过原数组长度,那么将溢出for(int j = i + 1; j <= i + nums[i];j++){  nums[j]--;//范围内的数字每次减1  if(nums[j] < 0) return false;  }  }  if(nums[n - 1] != 0) return false;  return true;  
}

样例解释:

第一个样例

  • 6 4 4 3 3 2 2(已呈递减)
  • 3 3 2 2 1 1 (删除上个序列中的第一个数6,并对第一个数后面的6个数字进行减1操作得到3 3 2 2 1 1)
  • 2 1 1 1 1 (删除上个序列中的第一个数3,对第一个数后面的3个数字进行减1操作得到2 1 1 1 1)
  • 0 0 1 1(删除上个序列中的第一个数2,对第一个数后面的2个数字进行减1操作得到0 0 1 1)
  • 1 1(前一个序列中的0可以直接忽略)
  • 0 0(删除上个序列中的第一个数1,对第一个数后面的1个数字进行减1操作得到0 0)
  • 故第一个样例可图,输出yes

第二个样例

  • 4 2 1 1 1
  • 1 0 0 0
  • -1 0 0
  • 出现负数,故第二个序列不可图,输出no

AC代码:

没有使用奇偶性剪枝(124ms)
在这里插入图片描述

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int nums[1010];
int n;bool cmp(int a,int b)//从大到小排序
{return a > b;
}//Havel-Hakimi核心代码
bool Havel_Hakimi(int nums[])
{for(int i = 0;i < n;i ++){  sort(nums + i,nums + n,cmp);if(i + nums[i] >= n) return false;for(int j = i + 1; j <= i + nums[i];j++){  nums[j]--;  if(nums[j] < 0) return false;  }  }  if(nums[n - 1] != 0) return false;  return true;  
}int main()
{int c;cin >> c;//多组数据while (c--){memset(nums,0,sizeof nums);//初始化cin >> n;for (int i = 0;i < n;i++) cin >> nums[i];if (Havel_Hakimi(nums)) cout << "yes" << endl;//数组中的数全为0且无负数,说明序列可图else cout << "no" << endl;}return 0;
}

参考代码:

(没套用代码模板,整了一天也没AC)

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int flag = 1;//flag = 1说明序列可图,flag = 0说明序列不可图
int nums[1010];bool cmp(int a,int b)//从大到小排序
{return a > b;
}int main()
{int c;cin >> c;//多组数据while (c--){memset(nums,0,sizeof nums);//初始化int n;cin >> n;for (int i = 0;i < n;i++) cin >> nums[i];sort(nums,nums + n,cmp);//排序//Havel-Hakimiint temp;for (int j = 0;j < n;j++){temp = nums[j];//temp暂存序列中的第1个数nums[j] = 0;//保存后将第1个数改为0int u = j + 1;//用来遍历数字使其减1for (int k = 1;k <= temp;k++)//当前序列中第一个非0数是几,执行几次循环{nums[u++] -= 1;if (nums[u - 1] < 0)//减为负数{flag = 0;break;}}sort(nums + j + 1,nums + n,cmp);//删除1个数字后的序列,从删除数字的下个数字开始重新排序}for (int i = 0;i < n;i++)//遍历有无不为0的数 {if (nums[i] != 0) flag = 0;}if (flag) cout << "yes" << endl;//数组中的数全为0且无负数,说明序列可图else cout << "no" << endl;}return 0;
}

AC代码的优化:

奇偶性剪枝(46ms)

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int nums[1010];
int n,sum;bool cmp(int a,int b)
{return a > b;//non-increasing sort
}//Havel-Hakimi algorithm
bool Havel_Hakimi(int nums[])
{for (int i = 0;i < n;i++){sort(nums + i,nums + n,cmp);if (i + nums[i] >= n) return false;for (int j = i + 1;j <= i + nums[i];j++){nums[j]--;if (nums[j] < 0) return false;}}if (nums[n - 1] != 0) return false;return true;
}int main()
{int c;scanf("%d",&c);while (c--){memset(nums,0,sizeof nums);//initscanf("%d",&n);sum = 0;for (int i = 0;i < n;i++){scanf("%d",&nums[i]);sum += nums[i];}/*odd & 1 = 1even & 1 = 0奇偶性剪枝:若所有的度加起来为奇数,则不可图*/if (sum & 1)   {printf("no\n");continue;}if (Havel_Hakimi(nums)) printf("yes\n");else printf("no\n");}return 0;
}

在这里插入图片描述

这篇关于Degree Sequence of Graph G(Havel-Hakimi定理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591565

相关文章

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【UVA】1626-Brackets sequence(动态规划)

一道算是比较难理解的动规。 状态转移分2个: (用d[i][j]表示在i~j内最少需要添加几个括号,保持平衡) 1.如果s[i]和s[j]是一对括号,那么d[i][j] = d[i + 1][j - 1] 2.否则的话 d[i][j] = min(d[i][k],[k + 1][j]); 边界是d[i + 1][i] = 0; d[i][i] = 1; 13993644 162

【UVA】10534 - Wavio Sequence(LIS最长上升子序列)

这题一看10000的数据量就知道必须用nlog(n)的时间复杂度。 所以特意去看了最长上升子序列的nlog(n)的算法。 如果有2个位置,该位置上的元素为A[i]和A[j],并且他们满足以下条件: 1.dp[i] = dp[j]    (dp[x]代表以x结尾的最长上升子序列长度) 2.A[i] < A[j] 3.i < j 那么毫无疑问,选择dp[i] 一定优于选择dp[j] 那么

CPC23三 K.(Lucas定理)

K.喵喵的神·数 Time Limit: 1 Sec Memory Limit: 128 MB Description 喵喵对组合数比较感兴趣,并且对计算组合数非常在行。同时为了追求有后宫的素质的生活,喵喵每天都要研究质数。 我们先来复习一下什么叫做组合数。对于正整数P、T 然后我们再来复习一下什么叫质数。质数就是素数,如果说正整数N的约数只有1和它本身,N

2015年多校联合训练第一场OO’s Sequence(hdu5288)

题意:给定一个长度为n的序列,规定f(l,r)是对于l,r范围内的某个数字a[i],都不能找到一个对应的j使得a[i]%a[j]=0,那么l,r内有多少个i,f(l,r)就是几。问所有f(l,r)的总和是多少。 公式中给出的区间,也就是所有存在的区间。 思路:直接枚举每一个数字,对于这个数字,如果这个数字是合法的i,那么向左能扩展的最大长度是多少,向右能扩展的最大长度是多少,那么i为合法的情况

A Comprehensive Survey on Graph Neural Networks笔记

一、摘要-Abstract 1、传统的深度学习模型主要处理欧几里得数据(如图像、文本),而图神经网络的出现和发展是为了有效处理和学习非欧几里得域(即图结构数据)的信息。 2、将GNN划分为四类:recurrent GNNs(RecGNN), convolutional GNNs,(GCN), graph autoencoders(GAE), and spatial–temporal GNNs(S