zoukankan      html  css  js  c++  java
  • uestc 握手

    Havel-Hakimi定理

    算法定义:

    Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的。

    2,首先介绍一下度序列:若把图 G 所有顶点的度数排成一个序列 S,则称 S 为图 G 的度序列。

    3,一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。

    4,判定过程:(1)对当前数列排序,使其呈递减,(2)从S【2】开始对其后S【1】个数字-1,(3)一直循环直到当前序列出现负数(即不是可图的情况)或者当前序列全为0 (可图)时退出。

    5,举例:序列S:7,7,4,3,3,3,2,1  删除序列S的首项 7 ,对其后的7项每项减1,得到:6,3,2,2,2,1,0,继续删除序列的首项6,对其后的6项每项减1,得到:2,1,1,1,0,-1,到这一步出现了负数,因此该序列是不可图的。

    有2种不合理的情况:

    (1)某次对剩下序列排序后,最大的度数(设为d1)超过了剩下的顶点数;

    (2)对最大度数后面的d1个数各减1后,出现了负数。

    以上转自http://blog.csdn.net/zhongshijunacm/article/details/41213635

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<queue>
     7 #include<algorithm>
     8 #include<map>
     9 #include<iomanip>
    10 #include<climits>
    11 #include<string.h>
    12 #include<cmath>
    13 #include<stdlib.h>
    14 #include<vector>
    15 #define INF 1e7
    16 #define MAXN 111111
    17 #define maxn 1000010
    18 #define Mod 1000007
    19 using namespace std;
    20 typedef long long LL;
    21 
    22 priority_queue<int,vector<int>,less<int> > que;
    23 queue<int> tmp;
    24 int n, temp;
    25 
    26 bool Hacel_Hakimi(int n)
    27 {
    28     int dmax, k, i;
    29     while (1)
    30     {
    31         dmax = que.top();
    32         que.pop();
    33         if (dmax > n - 1)
    34             return false;
    35         while (dmax--)
    36         {
    37             k = que.top();
    38             que.pop();
    39             k--;
    40             if (k < 0)
    41                 return false;
    42             tmp.push(k);
    43         }
    44         while (!tmp.empty())
    45         {
    46             k = tmp.front();
    47             tmp.pop();
    48             que.push(k);
    49         }
    50         dmax = que.top();
    51         if (dmax == 0 || n == 0)
    52             break;
    53         n--;
    54     }
    55     return true;
    56 }
    57 
    58 void process()
    59 {
    60     int i, x, n;
    61     while (!que.empty())
    62         que.pop();
    63     while (!tmp.empty())
    64         tmp.pop();
    65     scanf("%d", &n);
    66     int flag = 1;
    67     int sum = 0;
    68     for (i = 0; i<n; i++)
    69     {
    70         scanf("%d", &x);
    71         if (x < 0)
    72             flag = 0;
    73         que.push(x);
    74         sum += x;
    75     }
    76     if (!flag || sum % 2)    
    77     {
    78         puts("NO");
    79         return;
    80     }
    81     flag = Hacel_Hakimi(n);
    82     puts(flag ? "YES" : "NO");
    83 }
    84 
    85 int main()
    86 {
    87     int T;
    88     cin >> T;
    89     while (T--) {
    90         process();
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    QDUOJ LC的课后辅导 单调递增栈
    蓝桥杯 时间问题
    区间sum 和为k的连续区间-前缀和
    康托展开-全排列的编码与解码
    康托展开-全排列应用
    背包之01背包、完全背包、多重背包详解
    HDU
    辗转相除求最大公约数与最小公倍数
    快速幂(反复平方法)
    HDU
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4289355.html
Copyright © 2011-2022 走看看