关于可图化序列的一点结论 NEU 1429

Graphic Sequence


A
graphic sequence is a sequence of numbers which can be the degree
sequence
 of some graph. A sequence can be
checked to determine if it is graphic using GraphicQ[g]
in the Mathematica package Combinatorica` .

Erd?s
and Gallai (1960) proved that a degree
sequence
  is graphic iff the sum of vertex
degrees is even and the sequence obeys the property




for
each integer  (Skiena 1990, p. 157), and this condition also
generalizes to directed graphs.
Tripathi and Vijay (2003) showed that this inequality need be checked only for
as many  as there are distinct terms in the sequence, not for
all .

Havel
(1955) and Hakimi (1962) proved another characterization of graphic sequences,
namely that a degree sequence with =3" src="http://mathworld.wolfram.com/images/equations/GraphicSequence/Inline5.gif"
width="29" height="14"> and =1" src="http://mathworld.wolfram.com/images/equations/GraphicSequence/Inline6.gif"
width="35" height="14"> is graphical iff the sequence  is graphical. In addition, Havel (1955) and Hakimi
(1962) showed that if adegree
sequence
 is graphic, then there exists a graph  such that the node of highest degree is adjacent to
the  next highest degree vertices of , where  is the maximum degree of .

No
degree sequence can be graphic if all the degrees occur with multiplicity 1
(Behzad and Chartrand 1967, p. 158; Skiena 1990, p. 158). Any degree
sequence whose sum is even can be
realized by a multigraph having
loops (Hakimi 1962; Skiena 1990, p. 158).

很不错的一个定理: 就是给出一个度序列,然后 判读这个度序列是不是可图的当且仅当 满足 : sigma<1,r>(di)
<= k*(k-1) +sigma<k+1,n> min(k,di)

(    0< k<=n   )

注意到定理中要求 sigma<k+1,n> min(k,di) ; 所以我们可以二分找出度数大于k的区间求出其前缀和即可
时间复杂的达到 O(nlogn) 然后套公式就行了。

其实还有另外一个定理: havel定理,不是怎么实用的定理感觉是 。
网上题解代码 复杂度都是O(n^2logn) 没事水数据玩都是。  还扯些没用的优化,

好像可以计数排序写复杂度是O(n^2) 省赛还是被卡掉的。 O(nlogn) 还挺快>_<。

给出一道题:

1429:
Traveling


题目描述

SH
likes traveling around the world. When he arrives at a city, he will ask the
staff about the number of cities that connected with this city directly. After
traveling around a mainland, SH will collate data and judge whether the data is
correct.

A
group of data is correct when it can constitute an undirected graph.

输入

There
are multiple test cases. The first line of each test case is a positive integer
N (1<=N<=10000) standing for the number of cities in a mainland. The
second line has N positive integers a1, a2, ...,an. ai stands for the number of
cities that connected directly with the ith city. Input will be ended by the END
OF FILE.

输出

If
a group of data is correct, output "YES" in one line, otherwise, output
"NO".

样例输入

8 7 7 4 3 3 3 2 1 10 5 4 3 3 2 2 2 1 1 1 

样例输出

NO YES

1 #include<cstdio>

2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAX = 1e5;
 6 int deg[MAX],sum[MAX],sum2[MAX];
 7 int cmp(int a,int b) {return a>b ;}
 8 int n;
 9 int check() {
10     if(sum[n]&1) return 0;
11     for(int k=1;k<=n;k++) {
12        int L=k+1,R=n; int ans;
13        while(L<=R) {
14             int mid=(R+L) >> 1;
15             if(deg[mid]>=k) ans=mid,L=mid+1;
16             else R=mid-1;
17        }
18        sum2[k]=k*(ans-k)+sum[n]-sum[ans];
19     }
20     int ans;
21     for(int i=1;i<=n;i++) {
22         if(sum[i]<=i*(i-1)) continue;
23         ans=sum2[i];
24        // for(int k=i+1;k<=n;k++) ans+=min(i,deg[k]);
25         if(sum[i]>i*(i-1)+ans) return 0;
26  
27     }
28     return 1;
29 }
30  
31 int main() {
32     while(scanf("%d",&n)==1) {
33         memset(sum,0,sizeof(sum));
34         memset(sum2,0,sizeof(sum2));
35         for(int i=1;i<=n;i++) scanf("%d",&deg[i]);
36         sort(deg+1,deg+n+1,cmp);
37         for(int i=1;i<=n;i++) sum[i]=sum[i-1] + deg[i];
38         int ret=check();
39         if(ret) printf("YES\n");
40         else printf("NO\n");
41     }
42 }
43  
44 /**************************************************************
45     Problem: 1429
46     User: 20124906
47     Language: C++
48     Result: 正确
49     Time:201 ms
50     Memory:1960 kb
51 ****************************************************************/

关于可图化序列的一点结论 NEU 1429

时间: 2024-11-11 07:23:27

关于可图化序列的一点结论 NEU 1429的相关文章

序列可图化判定及顶点着色

1.度序列可图化问题 可图化的度序列其表示的图并不唯一,即画出来的图有可能不是同构体,主要原因是由度序列产生生成矩阵的时候方法并不唯一. 例子:度序列 [3 4 2 3 4 2] 图1 图2 注意度数为3 的两个顶点在图1中并不连接,在图2中却相连,说明图1图2不是同构. 对于可图化序列的简单图绘制需要用到生成矩阵,表示了随着顶点数增加而图拓展的过程.距离如下,度序列为 ,其相应的度序列矩阵为    生成矩阵的第i行等于度序列矩阵的第i行减去它的第i+1行得到,若度序列矩阵出现负值,则该序列不可

Havel-Hakimi定理---通过度数列判断是否可图化

0.可图:一个非负整数组成的序列如果是某个无向图的度序列,则该序列是可图的. 1.度序列:Sequence Degree,若把图G所有顶点的度数排成一个序列,责成该序列为图G的一个序列.该序列可以是非递增序的.可以是非递减序列.可以是任意无序的. 2.Havel-Hakimi定理:给定一个非负整数序列{d1,d2,...dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化.进一步,若图为简单图,则称此序列可简单图化. 定理描述:由非负整数组成的有限非递增序列,S={d1,d

Havel--Hakimi定理判断可图化 python

list1 = [ 4, 7, 7, 3, 3, 3, 2, 1 ] list2 = [ 5, 4, 3, 3, 2, 2, 2, 1, 1, 1 ] def havel_hakimi_algo( degree_list ): degree_list.sort( reverse = True ) print degree_list for degree in degree_list: if degree < 0: return False if degree != 0: remove_val =

Android图表库MPAndroidChart(七)—饼状图可以再简单一点

Android图表库MPAndroidChart(七)-饼状图可以再简单一点 接上文,今天实现的是用的很多的,作用在统计上的饼状图,我们看下今天的效果 这个效果,我们实现,和之前一样的套路,我先来说下这个的应用场景,假设,我是一名小学老师,现在教务处让我设置一个图表,说明下我带的班级期末考试有多少人优秀,多少人及格和不及格等等,而这些呢,我已经算出来百分比了,只剩下画图了,那好,我们就来实现以下吧 一.基本实现 首先是我们的布局 <com.github.mikephil.charting.cha

从 Java 代码逆向工程生成 UML 类图和序列图

from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM? Rational? Software Architect 从 Java? 源代码来逆向工程生成 UML 类和序列图. 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为,并用于扩展新的特性到产品. 作者详细说明了使用 IBM Rational Sof

图论——可图化

1.可图化 2.生成子图 顶点是母图的顶点,边是母图边的子集. 原文地址:https://www.cnblogs.com/juanzhi/p/12698612.html

最常用的UML图包括:用例图、类图、序列图、状态图、活动图、组件图和部署图

(转) 用例图 用例图描述了系统提供的一个功能单元.用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的功能需求,包括基于基本流程的"角色" (actors,也就是与系统交互的其他实体)关系,以及系统内用例之间的关系.用例图一般表示出用例的组织关系--要么是整个系统的全部用例,要么是完 成具有功能(例如,所有安全管理相关的用例)的一组用例.要在用例图上显示某个用例,可绘制一个椭圆,然后将用例的名称放在椭圆的中心或椭圆下面的中间位 置.要在用例图上绘制一个角色(表示一个系统用户),

关于前端组件化开发的一点思考

前端开发与其他程序开发的共性在于,同样要求“高内聚,低耦合,易读写,可复用”. “高内聚”是指将在逻辑上可以归类为一个单元的代码封装在一起,尽量保障一块代码集合主要解决一个需求,在前端开发中,最常见的便是将一个逻辑单元的代码使用IIFE函数进行封装. 可以说,保障代码高内聚即在一定程度上满足了代码“低耦合”的要求,因为低耦合即是要求一个逻辑单元的代码块在改动时,不会造成其他逻辑单元代码块的变动,在前端开发中,即是要求各代码块不要过多共享某变量或对象,在不得以的情况下,一定要清晰注释. “易读写”

UML学习(类图和序列图等)

visio绘制UML图使用visio 提示此UML形状所在的绘图页不是UML模型图的一部分 请问这个问题怎么解决?新建->选择绘图类型->选择软件与数据库模板->选择UML模型图->注意:如果不选择UML模型图的话,可能会出现无法编辑形状文本,提示“此UML形状所在的绘图页不是UML模型图的一部分,该形状设计用于利用UML模型图模板创建的绘图”所以利用Visio绘UML图第一步就是选择绘图类型为软件中的UML模型图. 还可以参考百度云盘的UML学习资料 参考:UML中几种类间关系: