题意:
给你所有点的度数,判断是否为简单图
思路:
百度了简单图的判定条件,是这样回答的:
首先要求所有数(度)之和是偶数,其次判断是否为简单图,方法:依次删去度最大的点,递归下去,最后可确定是否是简单图.
按照这个思路写了代码,WA了,原因是只进行了第一趟排序,正确做法应当是每次都排序,才能保证依次删去最大点。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10005;
int arr[N];
int cmp(int a,int b) {
return a > b;
}
int main(){
int n;
while (~scanf("%d", &n) && n) {
int sum = 0, maxn = -1;
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
maxn = max(maxn, arr[i]);
sum += arr[i];
}
if (sum % 2 != 0 || maxn >= n) {
printf("Not possible\n");
continue;
}
sort(arr, arr + n, cmp);
int ok = true;
for (int i = 0; i < n; i++) {
sort(arr + i, arr + n, cmp);//WA的原因,漏了这句
int temp = arr[i];
if (n - 1 - i < temp||!ok){
ok = false;
break;
}
for (int j = i + 1; j < i + 1 + temp; j++) {
arr[j]--;
if (arr[j] < 0){
ok = false;
break;
}
}
}
if (ok||arr[n-1]==0)
printf("Possible\n");
else
printf("Not possible\n");
}
return 0;
}