#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
#define N 100
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y
int array[N], v;
int func();
void qsort(int l, int r);
int main()
{
printf("请输入顶点数量(不小于15):");
scanf("%d", &v);
printf("请输入各顶点度数:");
for (int i = 0; i < v; ++i)scanf("%d", &array[i]);
int result = func();
if (result)printf("该序列为可图序列!\n");
else printf("该序列非可图序列!\n");
return 0;
}
int func(void)
{
int flag = 0;
for (int i = 0; i < v; ++i)
{
if (array[i] < 0 || array[i] >= v)return 0;
flag += array[i];
}
if (!flag)return 1;
else
{
qsort(0, v - 1);
for (int i = v - 2; i > v - 2 - array[v - 1]; --i)--array[i];
array[v - 1] = 0;
func();
}
}
void qsort(int l, int r)//应用二分思想
{
int mid = array[(l + r) / 2];//中间数
int i = l, j = r;
int x;
do {
while (array[i] < mid) i++;//查找左半部分比中间数大的数
while (array[j] > mid) j--;//查找右半部分比中间数小的数
if (i <= j)//如果有一组不满足排序条件(左小右大)的数
{
x = array[i];
array[i] = array[j];
array[j] = x;//交换
i++;
j--;
}
} while (i <= j);//这里注意要有=
if (l < j) qsort(l, j);
if (i < r) qsort(i, r);
}
Havel-Hakimi算法
最新推荐文章于 2022-05-06 14:43:56 发布