这题居然标题是英文的而题目是中文的,所以题意大家都很了解啦,这题就是个典型的图论题,我是去学习了一下havel-hakimi定理,这题就是判断那个数组是否可图化,如果可以就输出图的邻接矩阵。定理可以参考
http://www.docin.com/p-540438846.html
。这题一开始我用数组存,整的那叫一个麻烦还就是不过sample,后来百度说用结构体存点的度和起始的位置,就很快秒杀了这题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct vertex
{
int degree;
int index;
}v[11];
int n,b[11][11];
bool cmp(struct vertex a,struct vertex b)
{
return a.degree>b.degree;
}
bool havel(struct vertex v[])
{
for(int i=0;i<n-1;i++)
{
sort(v+i,v+n,cmp);
int t=v[i].index;
for(int j=i+1;j<=i+v[i].degree;j++)
{
b[t][v[j].index]=1;
b[v[j].index][t]=1;//无向图是对称的
v[j].degree--;
if(v[j].degree<0) return false;//判断是否可图化
}
}
if(v[n-1].degree!=0) return false;//是否可图化
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
v[i].index=i;//起始的位置
scanf("%d",&v[i].degree);
}
if(havel(v))
{
printf("YES\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==n-1) printf("%d\n",b[i][j]);
else printf("%d ",b[i][j]);
}
}
}
else printf("NO\n");
printf("\n");
}
}