题目链接 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", °ree[i]); sort(degree, degree+n); if(CanBuild()) printf("Possible\n"); else printf("Not possible\n"); scanf("%d", &n); } return 0; }
时间: 2024-09-30 04:39:27