Jun 8

给出顶点度数,图的存在性证明 不指定

felix021 @ 2008-6-8 23:07 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(4155) | Via 本站原创 | |
WHUACM 20080608 Day4个人赛C题

描述:给出图的顶点数以及每个顶点的度数(每两个顶点之间最多只有一条边),证明该图的存在性。

证明:
将图的顶点按度数排序,找到度数最大的顶点(设度数为n0)
去掉这个顶点,同时使接下来n0个顶点的顶点数减一。
重复上述步骤,直至剩余顶点的度数都为0,则图存在,否则图不存在。

C代码:

#include<stdio.h>

int d[1010];
void qsort(int a[], int s, int e);

int main(){
    int n, i, j, sum;
    scanf("%d", &n);//输入顶点数
    sum = 0;
    for(i = 0; i < n; i++){
      scanf("%d", &d[i]);//输入每个顶点的度数
      sum += d[i];
    }
    if(sum % 2 == 1){ //如果总度数为奇数,就不存在
      printf("NO\n");
      return 0;
    }
    qsort(d, 0, n-1);//先排序
    for(i = n - 1; i >= 0; i--){
      if(d[i] > i){ //如果最大度数大于剩余顶点数 就不存在
        printf("NO\n");
        return 0;
      }else{//否则去掉最大的顶点
        for(j = 0; j < d[i]; j++){
          d[i-j-1]--;
          if(d[i-j-1] < 0){//如果出现负度数 就不存在
            printf("NO\n");
            return 0;
          }
        }
        qsort(d, 0, i - 1);//再次排序
      }
    }
    printf("YES\n");//满足所有条件,存在
    return 0;
}

void qsort(int a[], int s, int e){
  int i = s, j = e, temp = a[s];
  if(s < e){
    while(i != j){
      while(a[j] > temp && i < j) j--;
      if(i < j) a[i++] = a[j];
      while(a[i] < temp && i < j) i++;
      if(i < j) a[j--] = a[i];
    }
    a[i] = temp;
    qsort(a, s, i-1);
    qsort(a, i+1, e);
  }
}




欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]