Havel-Hakimi定理 POJ1659

对于图的所有顶点,计算出每个顶点的度,度序列。给定一个序列判断序列是否可图。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int map[15][15];
struct vertext {
	int d;
	int num;
}x[15];
bool cmp(vertext a,vertext b) {
	return b.d<a.d;
}
int main() {
	int t,n;
	scanf("%d",&t);
	while(t--) {
		scanf("%d",&n);
		memset(map,0,sizeof map);
		for(int i=0;i<n;i++) {
			scanf("%d",&x[i].d);
			x[i].num=i;
		}
		sort(x,x+n,cmp);
		int flag=0;
		for(int i=0;i<n;i++) {
			sort(x+i,x+n,cmp);
			if(x[i].d>n-i-1) {
				flag=1;break;
			}
			for(int j=i+1;j<=i+x[i].d;j++) {
				map[x[i].num][x[j].num]=map[x[j].num][x[i].num]=1;
				x[j].d--;
				if(x[j].d<0) {
					flag=1;break;
				}
			}
			if(flag==1) break;
			x[i].d=0;
		}
		if(x[n-1].d!=0) flag=1;
		if(flag==0) {
			printf("YES\n");
			for(int i=0;i<n;i++) {
				for(int j=0;j<n;j++) {
					printf("%d",map[i][j]);
					if(j!=n-1) printf(" ");
				}
				printf("\n");
			}	
		}
		else printf("NO\n");
		if(t!=0) printf("\n");
	}
	return 0;
} 

 

posted @ 2016-07-15 00:10  _LinesYao  阅读(142)  评论(0编辑  收藏  举报