Havel-hakimi 定理 判断可图性
简单的说,判断序列 7,7,4,3,3,3,2,1 是否可图,删除首项,其后的首项个数项每项-1后排序,由于图中不可能出现负度数的点,一旦发现负数,即不可图。7,7,4,3,3,3,2,1--> 6,3,2,2,2,1,0 --> 2,1,1,1,0,-1.(over)。
再举一个例子,判断序列:5,4,3,3,2,2,2,1,1,1是否可图,5,4,3,3,2,2,2,1,1,1-->3,2,2,2,1,1,1,1,1-->1,1,1,1,1,1,1,1-->...-->0,0,0,0. 由此可判断是可图的。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define N 15 struct vertex { int degree; int index; }v[N]; int cmp(const void *a,const void *b) { return ((vertex*)b)->degree-((vertex*)a)->degree; } int main() { //freopen("input.txt","r",stdin); int r,k,p,q; int i,j,d1,t,n; int edge[N][N],flag; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&v[i].degree); v[i].index=i; } memset(edge,0,sizeof(edge)); flag=1; for(k=0;k<n&&flag;k++) { qsort(v+k,n-k,sizeof(vertex),cmp); if(v[0].degree==0) break; i=v[k].index; d1=v[k].degree; if(d1>n-k-1) flag=0; for(r=1;r<=d1&&flag;r++) { j=v[k+r].index; if(v[k+r].degree<=0) flag=0; v[k+r].degree--; edge[i][j]=edge[j][i]=1; } } if(flag) { printf("YES\n"); for(p=0;p<n;p++) { for(q=0;q<n;q++) { if(q) printf(" "); printf("%d",edge[p][q]); } printf("\n"); } } else printf("NO\n"); if(t) printf("\n"); } return 0; }
时间: 2024-09-20 16:27:41