题目大意:给出一系列的点,问能否组成一个图
解体思路:Havel-Hakimi定理的应用。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cstdlib>
using namespace std;
const int maxn = 10000 + 5;
int num;
int d[maxn];
int cmp(const void *a,const void *b) {
return *(int *)b - *(int *)a > 0 ? 1: -1;
}
bool Havel_Hakimi() {
for(int i = 0; i < num - 1; i++) {
qsort(d+i,num-i,sizeof(d[0]),cmp);
if(i+d[i] >= num) return false;
for(int j = i + 1; j <= d[i]+i; j++) {
d[j]--;
if(d[j] < 0)
return false;
}
}
if(d[num-1] != 0)
return false;
return true;
}
int main() {
while(scanf("%d", &num) != EOF && num) {
for(int i = 0; i < num; i++)
scanf("%d", &d[i]);
if(Havel_Hakimi())
printf("Possible\n");
else
printf("Not possible\n");
}
}