Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

fuck!!!!!!!!!!!!!!!!!!!!!!!!!!一直过不去的看这里,用havel定理的

Posted by lizimeng at 2016-07-14 11:36:39 on Problem 1659
如果你用的是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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator