关闭

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

标签: c++pojalgorithm
154人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31763次
    • 积分:1511
    • 等级:
    • 排名:千里之外
    • 原创:124篇
    • 转载:3篇
    • 译文:0篇
    • 评论:8条
    最新评论