题目大意是有每个点的初度构造一个图,这个图不唯一。
1659
/*8736366 MDK 1659 Accepted 696K 0MS G++ 2288B 2011-06-07 19:31:53
*/
struct frog
{
int va,station;
};
int cmp(const void *a,const void *b)
{
return (*(frog *)a).va > (*(frog *)b).va ? -1:1;
}
int main()
{
int T;SCF(T);
int mat[MAXN][MAXN];
frog fgp[MAXN];
while(T--)
{
SET(mat,0);memset(fgp,0,sizeof(struct frog)*MAXN);
int n,d,sta;SCF(n);
F(i,n) fgp[i].station=i,SCF(fgp[i].va);bool flag =0;
qsort(fgp,n,sizeof(fgp[0]),cmp);
//F(i,n) DB(fgp[i].station<<"--"<<fgp[i].va);
//DB("---");
F(i,n)
{
d=fgp[0].va;fgp[0].va=0;
sta=fgp[0].station;
//F(i,n) DB(fgp[i].station<<"--"<<fgp[i].va);
if(d==0) break;
FOR(j,1,d)
{
fgp[j].va--;
if(fgp[j].va<0) {flag=1;break;}
else mat[sta][fgp[j].station]=mat[fgp[j].station][sta]=1;
//PP(n,n,mat);
}
if(flag) break;
else
{
qsort(fgp,n,sizeof(fgp[0]),cmp);
}
//DB("____");
}
if(!flag)
{
printf("YES\n");
F(i,n)
{
F(j,n)
{
printf("%d",mat[i][j]);
if(j!=n-1) printf(" ");
}
printf("\n");
}
}
else
printf("NO\n");
if(T) printf("\n");
}
}
这里有个Haval-Hakimi定理。
memset初始化结构体:memset(&stTest,0,sizeof(struct sample_struct));挺方便。