题意:给出n个结点和每个结点的度数,问是否可能构成简单图,两个结点连线不能超过1条。
题解:遍历把度数匹配减掉,刚开始忘记每次把度数多优先选择,wa,然后每次排个序,让度数多的结点先减度数,ac。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 10005;
int degree[N], n, flag, i, j;
int cmp(int a, int b) {
return a > b;
}
int main() {
while (scanf("%d", &n) && n) {
flag = 0;
for (i = 0; i < n; i++) {
scanf("%d", °ree[i]);
if (degree[i] >= n)
flag = 1;
}
if (flag) {
printf("Not possible\n");
continue;
}
for (i = 0; i < n; i++) {
sort(degree, degree + n, cmp);
for (j = i + 1; j <= i + degree[i]; j++) {
degree[j]--;
if (degree[j] < 0)
break;
}
if (j != i + degree[i] + 1)
break;
}
if (i != n)
printf("Not possible\n");
else
printf("Possible\n");
}
return 0;
}