| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
fuck!!!!!!!!!!!!!!!!!!!!!!!!!!一直过不去的看这里,用havel定理的如果你用的是havel定理,那么要注意,一定别忘了每次处理完一个节点都要重新对节点的度进行排序。
如果你还是过不了,注意题目的输出要求是每个样例的输出都要用空行分开,这个会影响判定的。我就被这个卡了很久。
关于havel定理,这个是一个关于图重建的定理:对于一个非负整数序列,找到一个简单无向图,使得节点的度数序列等于给定序列。havel定理给出了一个算法。
http://blog.csdn.net/shuangde800/article/details/7857246
这个博客不错,里面有证明和实例。
附上我的代码,代码比较丑,不要介意。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
struct node
{
int id;
int deg;
};
void ssort(struct node* v,int s,int t)
{
int i,j,max;
struct node tmp;
for(i=s;i<=t;i++)
{
max = i;
for(j=i+1;j<=t;j++)
if(v[max].deg < v[j].deg)
max = j;
if(max!=i)
{
tmp = v[i];
v[i] = v[max];
v[max] = tmp;
}
}
}
int main()
{
int T,n,i,j,p[MAXSIZE][MAXSIZE];
struct node v[MAXSIZE];
scanf("%d",&T);
while(T > 0)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
v[i].id = i + 1;
scanf("%d",&(v[i].deg));
}
ssort(v, 0, n-1);
/*
for(i=0;i<n;i++)
printf("%d %d\n",v[i].id,v[i].deg);
*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
p[i][j] = 0;
for(i=0;i<n;i++)
{
if(i+v[i].deg >= n)
{
printf("NO\n");
//printf("1\n");
break;
}
for(j=i+1;j<=i+v[i].deg;j++)
{
v[j].deg--;
if(v[j].deg<0)
{
printf("NO\n");
break;
}
p[v[i].id-1][v[j].id-1] = 1;
p[v[j].id-1][v[i].id-1] = 1;
}
if(j<=i+v[i].deg)
break;
ssort(v, i+1, n-1);
}
if(i==n)
{
printf("YES\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",p[i][j]);
printf("\n");
}
}
printf("\n");
T--;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator