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