yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

エルデス-ガライの定理(判定法)

「やさしいグラフ論」を読んでプログラムしたくなったので、載せておきます。

ソースコードC++です。

 

入力:負でない整数の列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;
}