简单图论 ural 1779. The Great Team

本文介绍了一种解决特定图论问题的方法,即构造一个图,使得图中任意三个顶点的度数都不相同。通过贪心算法从前至后构造节点度数序列,并给出完整的C++实现代码。

题目链接:

http://acm.timus.ru/problem.aspx?space=1&num=1779

题目意思:

给n各点,让你构造一种连接方式,使得任意三个点的度数不一样。

解题思路:

利用贪心的思想这样构造:

从前至后构造节点度数分别为001122334455......

推出各节点的度数为:(节点标号从1开始)

sum[i]=i>>1(i为奇数)

sum[i]=i>>1-1(i为偶数)

然后从最后一个节点开始,因为它的度数最大,依次连线,当存在某个节点的度数已经达到sum[i]的时候,continue.

直到该点的度数达到。

当然当n为奇数时,存在一个问题,有的点的度数没达到,但又不能与前面的节点连,此时的处理是把该点与n节点相连。

代码;

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF (1<<30)
#define PI acos(-1.0)
using namespace std;

int sum[250];
int hav[250];
struct Edge
{
   int a,b;
}edge[22000];

//从低往高一次凑出各点的度数,0011223344
void init() //预处理出各点的度数
{
   for(int i=1;i<=200;i++)
   {
      if(i&1) //奇数的话,度数凑为i>>1
         sum[i]=i>>1;
      else  //偶数的话
         sum[i]=(i>>1)-1;
   }
   return ;
}

int main()
{
   init();

   int n;

   while(scanf("%d",&n)!=EOF)
   {
      if(n==3) //特殊情况,特殊处理下
      {
         printf("1\n3 2\n");
         continue;
      }
      int cnt=0;
      memset(hav,0,sizeof(hav));//表示该节点已有的度数
      for(int i=n;i>=1;i--)
      {
         if(hav[i]>=sum[i]) //该节点不用相连了
            continue;
         for(int j=i-1;j>=1;j--)
         {
            if(hav[j]>=sum[j])
               continue;
            edge[++cnt].a=i;
            edge[cnt].b=j;
            hav[i]++;
            hav[j]++;
            if(hav[i]>=sum[i])
               break;
         }
         if(hav[i]<sum[i]) //如果不能够连,则它与n节点相连
         {
            edge[++cnt].a=n;
            edge[cnt].b=i;
         }
      }
      printf("%d\n",cnt);
      //system("pause");
      for(int i=1;i<=cnt;i++)
         printf("%d %d\n",edge[i].a,edge[i].b);
   }
   return 0;
}




代码下载链接: https://pan.quark.cn/s/a4b39357ea24 第 一 章 概述 1-1 简述计算机程序设计语言的发展阶段。 解: 自从计算机诞生以来,程序设计语言经历了从机器语言、汇编语言到高级语言的演变过程,C++语言作为一种面向对象的编程语言,也属于高级语言范畴。 1-2 面向对象的编程语言具备哪些特性? 解: 面向对象的编程语言与传统的编程语言有着本质的区别,其设计初衷是为了更直观地模拟现实世界中存在的事物及其相互关系。这类编程语言将客观事物视为具有属性和行为的对象,通过抽象方法提取出同一类对象的共同属性(静态特征)和行为(动态特征),从而构建类。借助类的继承与多态机制,能够便捷地实现代码复用,显著缩短软件开发周期,并确保软件风格的一致性。因此,面向对象的编程语言使得程序能够较为准确地反映问题域的本质,软件开发人员可以运用人类惯用的思维模式进行开发工作。C++语言是目前应用最为广泛的面向对象编程语言。 1-3 结构化程序设计方法是什么?这种方法有哪些优势和不足? 解: 结构化程序设计的核心思想是自顶向下、逐步求精;其程序结构按照功能划分为多个基本模块;各模块之间的关联尽可能简化,在功能上保持相对独立性;每个模块内部均由顺序、选择和循环三种基本结构构成;模块化实现的具体途径是利用子程序。结构化程序设计由于采用模块分解与功能抽象,自顶向下、分而治之的策略,从而有效地将一个较为复杂的程序系统设计任务分解成许多易于管理和处理的子任务,便于开发与维护。 尽管结构化程序设计方法具备诸多优点,但它本质上仍是一种面向过程的程序设计方法,将数据与处理数据的操作分离为相互独立的实体。当数据结构发生变化时,所有相关的处理过程都需要进行相应的调整,每一种...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值