POJ1659Havel-Hakimi定理判断图的可图性

10 篇文章 0 订阅
8 篇文章 0 订阅
//度序列
//1,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,到这一步出现了负数,因此该序列是不可图的。
//132K	16MS
#include <iostream>
#include<algorithm>
using namespace std;

#define  MAX_N 12

static struct nod
{
	int e,num;
};

static nod x[MAX_N];
static int maps[MAX_N][MAX_N];
static int cmp(nod a,nod b)
{
	return a.e>b.e;
}

int main()
{
	int T;
	scanf("%d",&T);
	int N;
	while(T--)
	{
		memset(maps,0,sizeof(maps));
		scanf("%d",&N);
		for(int i=0;i<N;++i){
			scanf("%d",&x[i].e);
			x[i].num = i;
		}
	    bool flag = true;
		int cnt = 0;
		int num;
		while(true)
		{
		    sort(x+cnt,x+N,cmp);
			num = x[cnt].e;
			if (x[cnt].e==0)
			 break;
			for (int i=cnt+1;i<=cnt+num;++i)
			{
				x[i].e--;
				maps[x[i].num][x[cnt].num] = 1;
				maps[x[cnt].num][x[i].num] = 1;
				if (x[i].e<0)
				 flag = false;
			}
			if (!flag)
				break;
			cnt++;
		}
		if (flag){
		 printf("YES\n");
		 for (int i=0;i<N;++i){
		  for (int j=0;j<N;++j)
		    printf("%d ",maps[i][j]);
		  printf("\n");
		 }
		}
		else
		 printf("NO\n");
		if (T)
		 printf("\n");
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值