Frogs' Neighborhood

链接

[http://poj.org/problem?id=1659]

题意

分析

(Havel-Hakimi定理) 贪心就好了

代码

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=15;
struct str{
	int degree;
	int index;
}v[N];
bool cmp(str a,str b){
	return a.degree>b.degree;
}
int main(){
	int edge[N][N];
	int t,n,i,j;
    //freopen("in.txt","r",stdin);
	cin>>t;
	while(t--){
		cin>>n;
		memset(edge,0,sizeof(edge));
		for(i=0;i<n;i++){
			cin>>v[i].degree;
			v[i].index=i;
		}
		bool flag=1;
		sort(v,v+n,cmp);
		int pos=0;
		while(v[pos].degree&&flag){
			if(v[pos].degree>n-1-pos){
				flag=0;
				break;
			}
			else{
				for(i=1;i<=v[pos].degree&&flag;i++)
				{
					v[pos+i].degree--;
					if(v[pos+i].degree<0){
						flag=0;
						break;
					}
					int x=v[pos].index,y=v[pos+i].index;
					edge[x][y]=1,edge[y][x]=1;
				}
				pos++;
				if(flag) sort(v+pos,v+n,cmp);
			}
		}
		if(!flag) cout<<"NO\n";
		else{
			cout<<"YES\n";
			for(i=0;i<n;i++)
			{
				for(j=0;j<n;j++)
				{
					if(j==0) cout<<edge[i][j];
					else cout<<' '<<edge[i][j];
				}
				cout<<endl;
			}
		}
		if(t) cout<<endl;
	}
	return 0;
}
posted @ 2018-10-31 19:28  ChunhaoMo  阅读(177)  评论(0)    收藏  举报