博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UESTC 913 握手 Havel定理+优先队列
阅读量:5237 次
发布时间:2019-06-14

本文共 1254 字,大约阅读时间需要 4 分钟。

给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化。进一步,若图为简单图,则称此序列可简单图化。

此题因为是无自环无重边,所以是简单图。用判定简单图可图化的Havel-Hakimi定理。

Havel-Hakimi定理:

一个度序列:

是简单图度序列当且仅当:

是简单图的度序列。

简单来讲,算法流程如下:

设度序列为d1,d2,d3....dn

1.如果度序列中元素有负数或者度序列和不为偶数,则肯定不可图。

2.每次取度序列中最大元素,设为M,如果M>n-1(n为此时的元素数),则不可图。否则取次大的M个元素,将他们都减1,再次加入到度序列中,元素数减1,如此往复,直到:

(1)度序列出现负数元素,则不可图,退出。

(2)度序列全为0,则可图,退出。

 

回到题目,这题由于n过大(10^5),所以不能每次都排序来找前M大的数,所以考虑用优先队列来实现高效的插入,排序,取最大元素等操作。

(优先队列的复杂度)

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define N 100007priority_queue
,less
> que;queue
tmp;int check(int n){ int dmax,k,i; while(1) { dmax = que.top(); que.pop(); if(dmax > n-1) return 0; while(dmax--) { k = que.top(); que.pop(); k--; if(k < 0) return 0; tmp.push(k); } while(!tmp.empty()) { k = tmp.front(); tmp.pop(); que.push(k); } dmax = que.top(); if(dmax == 0 || n == 1) break; n--; } return 1;}int main(){ int t,n,i,x; scanf("%d",&t); while(t--) { while(!que.empty()) que.pop(); while(!tmp.empty()) tmp.pop(); scanf("%d",&n); int flag = 1; int sum = 0; for(i=0;i
View Code

 

转载于:https://www.cnblogs.com/whatbeg/p/3765392.html

你可能感兴趣的文章
Java Map 常见用法举例
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
Linux vi/vim
查看>>
zookeeper适用场景:分布式锁实现
查看>>
110104_LC-Display(液晶显示屏)
查看>>
javascript全局变量
查看>>
全连接神经网络(DNN)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
28 hashlib 模块 logging 模块 和 configparser模块 functools模块的偏函数partial
查看>>
普通求素数和线性筛素数
查看>>
React Router 4.0 基本使用
查看>>
作业完成2
查看>>
PHP截取中英文混合字符
查看>>
HTA - OnKeyDown
查看>>
【洛谷P1816 忠诚】线段树
查看>>
CDN 学习笔记
查看>>