HDU 2454 Degree Sequence of Graph G (可簡單圖化的判定 havel定理)
阿新 • • 發佈:2019-02-09
題意:給出N個點的度(簡單圖),問能能否畫出個圖,(其實就是給出一個串非負的序列是否有對應的圖存在)
沒見過這個定理 題意真的難懂。
havel定理就是一個給出一串非負的序列,存在一個無向圖使得圖中各點的度與此序列一一對應,則稱此序列可圖化。簡單圖的話就是,可簡單圖化。
可簡單圖化的判定(Havel定理):把序列排成不增序,即d1>=d2>=……>=dn,則d可簡單圖化當且僅當d’={d2-1,d3-1,……d(d1+1)-1, d(d1+2),d(d1+3),……dn}可簡單圖化。簡單的說,把d排序後,找出度最大的點(設度為d1),把它與度次大的d1個點之間連邊,然後這個點就可以不管了,一直繼續這個過程,直到建出完整的圖,或出現負度等明顯不合理的情況。
注意:
1.圖的總度是偶數。
2.每個點的度不超過N-1。
3.非下降排序,依次刪邊。若出現負度就是不合法的
AC程式碼:
#include<stdio.h> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int t,n,i,j; int a[1010],flag; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0; i<n; i++) scanf("%d",&a[i]); for(i=0; i<n; i++) { if(a[i]>n) break; } if(i<n) { printf("no\n"); continue; } for(i=0; i<n; i++) { int cnt=0; flag=0; sort(a,a+n,cmp); for(j=1; j<n; j++) { if(cnt==a[0]) break; a[j]--; if(a[j]<0) { flag=1; break; } cnt++; } if(cnt==0) break; if(flag) break; a[0]-=cnt; } if(flag) { printf("no\n"); continue; } for(i=0; i<n; i++) { if(a[i]) break; } if(i<n) printf("no\n"); else printf("yes\n"); } return 0; } /* 4 4 3 2 1 1 */