题意:对于一个简单图(不存在平行边和自旋边),输入所有的点的度,问,能不能变成一个简单图.
解题思路:
可图化定理.https://blog.csdn.net/shuangde800/article/details/7857246
对所有点的度从大到小排序,每次都选取一个度最大的点(度为n),往后的n个点度数每个都减一,如果,发现出现负数,或者不够减,那就不能变成简单图.
WA了很多次,主要错在以下俩个原因,刚开始从小的开始删除.考虑下面这组输入,
4 1 1 2 2,如果从小的开始删,第一次删除后变成 0 0 2 2 ,这个一个错误的图.
第二次只排了一次.
第一次排序后 d1 >= d2 >= d3 >= ......dn,但是在删除一次后,不保证序列还是递减.
#include "pch.h"
#include <string>
#include<iostream>
#include<map>
#include<memory.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<math.h>
#include<iomanip>
#include<bitset> namespace cc
{
using std::cout;
using std::endl;
using std::cin;
using std::map;
using std::vector;
using std::string;
using std::sort;
using std::priority_queue;
using std::greater;
using std::vector;
using std::swap;
using std::stack;
using std::bitset; constexpr int N = ; int a[N];
int n;
bool check()
{
for (int i = ;i < n - ;i++)
{
sort(a + i, a + n, greater<int>());
if (i + a[i] >= n) return false;
for (int j = i + ;j <= i + a[i];++j)
{
--a[j];
if (a[j] < )return false;
}
}
if (a[n - ] != )
return false;
return true;
} void solve()
{
while (cin >> n && n)
{
memset(a, , sizeof(a));
int ok = ;
for (int i = ;i < n;i++)
{
cin >> a[i];
if (a[i] >= n)
{
ok = ;
}
} if (ok == && check())
{
cout << "Possible" << endl;
}
else
{
cout << "Not possible" << endl;
}
} } }; int main()
{ #ifndef ONLINE_JUDGE
freopen("d://1.text", "r", stdin);
#endif // !ONLINE_JUDGE
cc::solve(); return ;
}