1. 程式人生 > >HDU 2454 Degree Sequence of Graph G (可簡單圖化的判定 havel定理)

HDU 2454 Degree Sequence of Graph G (可簡單圖化的判定 havel定理)

題意:給出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
*/