update 2017.7.10

Candy?'s 不饱和度

题目背景

化学老师让同学们出题!昌老师担任有机组组长!

Candy?出了一道数不饱和度的题目,昌老师不会做所以拒绝接受!!!

于是Candy?又出了一道用 \(Polya定理\) 数卤代烃个数的题目,然后把原来这道题扔给了你。


题目内容

你有一个有多个环的烷烃的键线式,求他的不饱和度。

值得注意的是,键线式的C原子并没有标出来,并且线可能是直线、斜线或者曲线,上面的C原子数目不定。

下面有几个例子,其中X表示线,0表示空:

  1. 1 7

    XXXXXXX

    是一个饱和链烃,不一定有几个C,不饱和度是0.

  2. 4 7

    XXXXXXX

    XOOOOOX

    XOOOOOX

    XXXXXXX

    最简单的情况就是一个4个C的环烷烃,不饱和度为1.

  3. 3 7

    XXXXX00

    0X0X0X0

    00XXXXX

    这是一个有两个环的烃,不饱和度是2

    它可能张这个样子

  4. 4 7

    000X000

    00X0X00

    0X000X0

    0XXXXX0

    她的不饱和度是1,样子自行脑补,我懒得画了。


输入输出 & 数据规模

输入一个n行m列的矩阵,X表示线,0表示空,是一个有机物的键线式。输出他的不饱和度

\(n,m < 1000\)


样例

Sample Input

4 7
XXXXXXX
XOOOOOX
XOOOOOX
XXXXXXX

Sample Output

1

下面是题解和标程


题解

最初的想法来自2016.6.26

那时候觉得复杂环式结构的烷烃不饱和度好神奇,从图论的角度考察了一下,还写了一篇周记。

一年后做化学题又想到了这个东西,拿着它去考灰哥有没有忘记我的周记,结果他随手用了另一种方法,好快好有趣,貌似正确性有待商榷。我尝试卡了一下,发现好像只有平面图成立,然后证明了一下成功了。

后来我发现那就是欧拉公式,并且我的证明和他一模一样,如果我早出生是不是可以叫Candy?公式.......


扔定理就跑:

定理1:任意一个烷烃可以看成无向简单图\(G(V,E)\),那么他的不饱和度为

\[\mid E\mid - \mid V\mid +1
\]

其中\(V\)是点集,\(E\)是边集

定理2:如果由烷烃得到的图\(G\)是平面图,那么

\[它把平面划分成的区域数(除去最外围平面) = \mid E\mid - \mid V\mid +1
\]

平面图就是能画在平面上使得边仅在顶点处相交的图。

证明去看欧拉公式的吧,不想写。


这样一来对于化学题,一眼就看出不饱和度了。

但是出成OI题的话,如果标出C的位置可以用数分子式的方法很快水过去,所以才变成不确定C原子,这样的话就需要得到上面的定理然后搜一下0组成的连通块数就好了,小心外圈的0没有连起来


大多数人应该不会这个方法吧,昌老师就不会

Candy? : 你怎么知道这个方法的 (惊恐)

某冰 : 不就应该是这样吗 (一脸鄙视)


标程

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 105; int n, m, ans;
char s[N][N]; int dfc, vis[N][N];
inline bool valid(int x, int y) {return x >= 0 && y >= 0 && x <= n && y <= m && s[x][y] != 'X' && !vis[x][y];}
void dfs(int x, int y) {
vis[x][y] = dfc;
if(valid(x-1, y)) dfs(x-1, y);
if(valid(x+1, y)) dfs(x+1, y);
if(valid(x, y-1)) dfs(x, y-1);
if(valid(x, y+1)) dfs(x, y+1);
}
int main() {
freopen("in", "r", stdin);
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++) scanf("%s", s[i]+1);
n++; m++;
for(int i=0; i<=n; i++) for(int j=0; j<=m; j++)
if(s[i][j] != 'X' && !vis[i][j]) dfc++, dfs(i, j);
printf("%d", dfc-1);
}

[一个脑洞] Candy?'s 不饱和度的更多相关文章

  1. Leetcode 动态规划 Candy

    本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie Candy Total Accepted: 16494 Total Submissions: ...

  2. CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)

    CSS不像其它高级语言一样支持算术运算.变量.流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等.而javascript则是一种半面向对象 ...

  3. 关于前端CSS预处理器Sass的小知识!

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  4. (1)RGB-D SLAM系列- 工具篇(硬件+关键技术)

    /*************************************************************************************************** ...

  5. Promise 原理探究及其简单实现

    可移步 http://donglegend.com/2016/09/11/promise%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ 观看 Promise是个什么玩意,大 ...

  6. Delphi的面向对象编程基础笔记

    1.面向对象.一门面向对象的编程语言至少要实现以下三个OOP的概念 封装:把相关的数据和代码结合在一起,并隐藏细节.封装的好处是利用程序的模块化,并把代码和其他代码分开 继承:是指一个新的类能够从父类 ...

  7. ACM入门:第s名的小红

    前几天的大一新生赛自己也跟着做了做,顺便测测后台数据有没有bug,这是一道排序题,题目如下: Problem Description 小红总是排第二,有点不服气,现在她想知道一个序列中第二小的数字是多 ...

  8. 【Docker】Docker概述

    [Docker] Docker可以说是近几年非常热门的技术之一了.不管是别人敦促我还是从自己的想法来说,都觉得Docker这玩意儿肯定是要好好学习一下的,无奈没啥时间专门播出来给Docker,一直以来 ...

  9. NOI前的考试日志

    4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...

随机推荐

  1. B. Secret Combination

    B. Secret Combination time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  2. Win10下安装RabbitMQ以及基本知识学习

    一.为什么选择RabbitMQ?      先说一下场景,这是我们公司遇到,当然我这里不做业务评价哈?虽然我知道他很不合理,但是我是无能为力的.APP端部分注册是Java开发的系统,然后业务端是C#开 ...

  3. 试用最强Spark IDE--IDEA

    1.安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示 ...

  4. 用thinkphp开启伪静态,用wamp开启很快搞定;但是用phpstudy总是开启失败,为什么?

    https://segmentfault.com/q/1010000005100662 thinkphp应用的根目录下.htaccess中的内容是: <IfModule mod_rewrite. ...

  5. 如何用SVN版本控制器将提交的文件还原到以前的版本

    工具/原料 SVN乌龟软件和相关的文件 方法/步骤 在相关的文件中右击鼠标,按右图进行选择 在弹出框的地方点击我标记的地方,查看下曾经提交过的版本文件 在弹出框的地方,上面就是有版本号,下面就是我们文 ...

  6. vue2.0集成百度UE编辑器,上传图片报错!!!

    我这边配置进去之后,界面加载,文本输入都没有问题,就是上传图片会有问题 这张图, 左边红色框框 就是目录结构咯, 右边红色框框 就是各种网上教程给出的第一个路径配置对吧, 下面的就是绿色 服务器接口配 ...

  7. ASP.NET Core下发布网站

    一.windows下发布到IIS 1.前奏:IIS上的准备 (1)IIS 必须安装AspNetCoreModule 模块 下载地址:(DotNetCore.2.0.3-WindowsHosting-a ...

  8. ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架。

    ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架.

  9. vue学习笔记(五)——指令

    13条指令 1. v-text (数据绑定语法-插值) <span v-text="msg"></span> <!-- 和下面的一样 --> & ...

  10. CCF系列之图像旋转(201503-1)

    试题编号: 201503-1时间限制: 5.0s 内存限制: 256.0MB 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表 ...