题目大意:给n个整数, 分别代表图中n个顶点的度,判断是否能构成一张图。
看到这个题后,除了所有数之和应该为偶数之外,没有别的想法了,只好在网上搜解题报告了。然后了解了Havel-Hakimi定理。之后的事情就简单了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 #include <functional> 4 using namespace std; 5 6 #define MAXN 10000+10 7 8 int a[MAXN]; 9 int n; 10 11 bool Havel_Hakimi() 12 { 13 for (int i = 0; i < n-1; i++) 14 { 15 sort(a+i, a+n, greater<int>()); 16 if (i + a[i] >= n) return false; 17 for (int j = i+1; j <= i+a[i]; j++) 18 { 19 a[j]--; 20 if (a[j] < 0) return false; 21 } 22 } 23 if (a[n-1]) return false; 24 return true; 25 } 26 27 int main() 28 { 29 #ifdef LOCAL 30 freopen("in", "r", stdin); 31 #endif 32 while (scanf("%d", &n) && n) 33 { 34 for (int i = 0; i < n; i++) 35 scanf("%d", &a[i]); 36 if (Havel_Hakimi()) printf("Possible "); 37 else printf("Not possible "); 38 } 39 return 0; 40 }