您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-09 22:20 573 查看
//度序列
//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ poj algorithm