Example 1:
S = 4, 3, 3, 3, 1
Where n = 5 (no. of vertices)
Step 1. Degree of all vertices is less than or equal to n ( no.of vertices)
Step 2. Odd number vertices are four.
Step 3. There is no degree less than zero.
Step 4. Remove ‘4’ from the sequence and subtract 1 from the remaining new sequence and arrange again in non-increasing order to get
S = 2,2,2,0
Step 5. Again remove ‘2 ‘ from the sequence and subtracting 1 from the remaining new sequence and arrange in non-increasing order we get
S= 1,1,0
Repeating the above step
S= 0,0
Step 6. Since all the deg remaining in the sequence is zero, the given sequence is graphical.
Example 2:
Consider the degree sequence: S = 7, 5, 5, 4, 4, 4, 4, 3
Where n = 8 (no. of vertices)
Step 1. Degree of all vertices is less than or equal to n ( no.of vertices)
Step 2. Odd number vertices are four.
Step 3. There is no degree less than zero.
Step 4. Remove ‘7’ from the sequence and subtract 1 from the remaining new sequence and arrange again in non-increasing order to get
S = 4, 4, 3, 3, 3, 3, 2
Step 5. Now remove the first ‘4 ‘ from the sequence and subtract 1 from the remaining new sequence to get:
S = 3, 2, 2, 2, 3, 2
rearrange in non-increasing order to get:
S = 3, 3, 2, 2, 2, 2
Repeating the above step we get following degree sequences:
S = 2, 2, 2, 1, 1
S = 1, 1, 1, 1
S = 1, 1, 0
S = 0, 0
Step 6. Since all the deg remaining in the sequence is zero, the given sequence is graphical (or in other words, it is possible to construct a simple graph from the given degree sequence).
#include <cstdio>
#include <functional>
#include <algorithm>
using namespace std;
const int MAXN = 11000;
int num[MAXN], n;
bool Havel_Hakimi()
{
for (int i = 0; i < n - 1; i++)
{
sort(num + i, num + n, greater<int>());
for (int j = i + 1; j <= i + num[i]; j++)
{
num[j]--;
if (num[j] < 0)
return false;
}
}
if (num[n - 1] != 0)
return false;
return true;
}
int main()
{
//freopen("input.txt", "r", stdin);
int i, j, t, sum;
bool flag;
while (scanf("%d", &n), n)
{
flag = true;
sum = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
if (num[i] >= n || num[i] < 0)
flag = false;
sum += num[i];
}
if (sum % 2 != 0)
flag = false;
if (sum == 0 || (flag && Havel_Hakimi()))
printf("Possible\n");
else
printf("Not possible\n");
}
return 0;
}