Havel-Hakimi定理(判断一个序列是否可图)
2013-03-13 21:17
387 查看
判断一个有限序列是否是可图的,有Havel-Hakimi定理:
由非负整数组成的非增序列s:d1,d2,~~~(省略号),dn(n>=2,d1>=1)
是可图的,当且仅当序列:
s1:d2-1,d3-1,~~~,d(d1+1) - 1,d(d1+2),~~~,dn是可图的。
序列s1中有n-1个非负整数,s序列中d1后的前d1个度数减1后构成s1中的前d1个数。
据此定理可以根据一个序列构造出相应的图(结果不唯一)
实例:POJ 1659 青蛙的邻居
注意:给每个顶点先编好号
View Code
由非负整数组成的非增序列s:d1,d2,~~~(省略号),dn(n>=2,d1>=1)
是可图的,当且仅当序列:
s1:d2-1,d3-1,~~~,d(d1+1) - 1,d(d1+2),~~~,dn是可图的。
序列s1中有n-1个非负整数,s序列中d1后的前d1个度数减1后构成s1中的前d1个数。
据此定理可以根据一个序列构造出相应的图(结果不唯一)
实例:POJ 1659 青蛙的邻居
注意:给每个顶点先编好号
View Code
#include <cstdio> #include <cstring> #include <cstdlib> #define N 15 struct vertex { int degree; // 顶点的度 int index; //顶点的序号 } V ; int cmp(const void *a,const void *b) //qsort中的cmp,逆序 { return ((vertex *)b)->degree -((vertex *)a)->degree; } int main() { int t; int edge ; //图的邻接矩阵 scanf("%d",&t); while(t--) { int flag = 2; //用来标记判断结果 int n; // memset(edge,0,sizeof(edge)); // freopen("in.cpp","r",stdin); // freopen("out.cpp","w",stdout); scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&V[i].degree); V[i].index = i; //按输入顺序给湖泊编号 } for(int k=0; k<n; k++) { qsort(V+k,n-k,sizeof(vertex),cmp); //对V数组后n-k个元素按非递增顺序排序 if(V[k].degree > n-k-1 || flag == 0) //不合理情形1:最大的度数超过了剩下的顶点数 { flag = 0; break; } if(V[k].degree == 0 && flag != 0) //序列中最大的数为0,且没有不合理情形,该序列可图 { flag = 1; break; } for(int r = k+1; r < k+1+V[k].degree; r++) { V[r].degree--; if(V[r].degree< 0) //不合理情形2:序列中出现了负数 { flag = 0; break; } edge[V[k].index][V[r].index] = edge[V[r].index][V[k].index] = 1; } } if(flag == 1) { puts("YES"); for(int r=0; r<n; r++) { for(int d = 0; d<n; d++) { printf("%d",edge[r][d]); if(d != n-1) printf(" "); } puts(""); } } else { puts("NO"); } if(t != 0) puts(""); } return 0; }
相关文章推荐
- poj1659 - Frogs' Neighborhood (利用Havel-Hakimi定理判断一个序列是否是可图的)
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个度数序列是否可图)
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个序列是否可图)
- POJ1659_Frogs' Neighborhood(判断一个度数序列是否可图/Havel-Hakimi定理)
- Havel-Hakimi定理(判断一个序列是否可图)
- Havel-Hakimi定理(判断一个序列是否可图)->POJ1659
- Havel-Hakimi定理(判断一个度序列是否可图)
- [poj 1659 ]Frogs\' Neighborhood(Havel-Hakimi定理(判断一个序列是否可图))
- Havel-Hakimi定理(判断一个序列是否可图) UVA 10720
- poj 1659 Frogs' Neighborhood (Havel-Hakimi定理,判断序列是否可图)
- Havel-Hakimi定理(判断是否可图序列)
- (图论)使用Havel-Hakimi定理判断给出的序列是否可图
- 图论-度序列可图性判断(Havel-Hakimi定理)
- 编写判断一个字符序列是否为回文。回文是指一个字符序列以中间 字符为基准两边字符完全相同,即顺着看和倒着看是相同的字符序列。
- 判断一个序列是否为另一个栈的出栈序列(栈的压入、弹出序列)
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- 给出一个入栈序列和一个出栈序列,判断出栈序列是否是入栈序列对应的出栈序列