题目大意是给定n个顶点的度,Havel-Hakimi判断有没有可能构成一个图。贪心法,每次选择当前集合中度最大的顶点,假设其度为k,那么我们尽可能和其之后度前k大的节点相连,若为0,则不可能,但没想到这还是一个名字听起来特别高端的定理,Havel-Hakimi定理。注意剪枝,并且这里有一个让本人wa了n次的概念性问题就是,简单图可以使不连通的。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int d[10010];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n;
while(cin>>n&&n){
int sum=0;
bool mark=true;
for(int i=0;i<n;i++) {
cin>>d[i];sum+=d[i];
if(d[i]>=n) mark=false;
}
if((sum&1)||sum>(n*(n-1))||!mark) {printf("Not possible\n");continue;}// 加上||sum<((n-1)<<1)则WA
for(int i=0;i<n;i++){
sort(d+i,d+n,cmp);
if(!d[i]) break;
int t=d[i];
for(int j=i+1;j<n&&t;j++){
if(!d[j]) break;
d[j]--;t--;
}
if(t) {mark=false;break;}
}
if(!mark) printf("Not possible\n");
else printf("Possible\n");
}
return 0;
}