uva10720-图重建

题目链接 http://acm.hust.edu.cn/vjudge/problem/21421

 

解题思路

容易想到一种贪心策略:每个点都找剩余度数最多的几个点连线。

因为是简单图,所以找过的点不能再连线。

为什么这样对呢,有个定理Havel-Hakimi 。

 

代码

#include<stdio.h>
#include<math.h> 
#include<string.h>
#include<algorithm>
#define MAX_LEN 10005
using namespace std;
int degree[MAX_LEN];
int n;
bool CanBuild() 
{
    int i = n - 1;
    while(i>=0) {
        int u = degree[i];
        if(u < 0) return false;
        while(u) {
            if(i - u >= 0) degree[i-u]--;
            else return false;
            if(degree[i-u] < 0) return false;
            u--;
        }
        sort(degree, degree + i);
        i--;
    }
    return true;
}
int main()
{
    scanf("%d", &n);
    while(n != 0) {
        for(int i=0; i<n; i++) scanf("%d", &degree[i]);
        sort(degree, degree+n);
        if(CanBuild()) printf("Possible\n");
        else printf("Not possible\n");
        scanf("%d", &n);
    }
    return 0;
}
View Code

 

posted @ 2016-08-20 14:27  啊嘞  阅读(134)  评论(0编辑  收藏  举报