エルデス-ガライの定理(判定法)
「やさしいグラフ論」を読んでプログラムしたくなったので、載せておきます。
入力:負でない整数の列s:d1,d2,・・・,dn(d1≧d2≧・・・≧dn)
出力:sがグラフ的であるならばYes、そうでないならばNo。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
//負でない整数の列の入力
int N = 0;
cin >> N;
vector<int> d(N+1,0);
for(int i = 1; i < d.size(); i++){
cin >> d[i];
}
//前計算
vector<int> sum(N+1,0);
for(int i = 1; i < d.size(); i++){
sum[i] = d[i];
}
for(int i = 1; i < sum.size(); i++){
sum[i] = sum[i-1] + sum[i];
}
//次数の総数が偶数かどうかの判定
bool check = true;
if(sum[sum.size()-1] % 2 != 0){
check = false;
}else{
int sub = 0;
for(int k = 1; k <= N-1; k++){
sub = k * (k-1);
for(int i = k+1; i <= N; i++){
sub = sub + min(k, d[i]);
}
if(sum[k] <= sub){
}else{
check = false;
break;
}
}
}
if(check == true){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}