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. angular2 表单验证

    模版式表单 (1) angular遇到form自动接管,不想自动接管,添加ngNoForm,当标签为div时,但想被表单接管,添加ngForm; (2) ngForm可以被模版本地变量引用,以便在模版 ...

  2. @requestBody注解

  3. 试用最强Spark IDE--IDEA

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

  4. [国嵌攻略][099][Linux内核配置与编译]

    为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...

  5. html日历(2)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. java中数组中一些方法的总结

    这个方法可以控制复制原数组的长度,想要复制多少就可以复制多少 这种复制方法不是特别灵活.只能复制整个数组或者对数组从首部开始进行截取.无法灵活的想复制哪里就复制哪里.因此一般用在数组的扩容上. jdk ...

  7. Dig out WeChat deleted chat messages on Android Phone

    As we know that WeChat will wipe deleted chat messages. That's why forensic guys could  not dig out ...

  8. bat复制文件夹下所有文件到另一个目录

    一个需求,网上了半天都是错了,所以记一下吧,方便你我. copy是文件拷贝,文件夹拷贝需要用到xcopy @echo off::当前盘符set curPath=%cd%set digPath =&qu ...

  9. SQL中MAX()

    列column_name中的数据可以是数值.字符串或是日期时间数据类型.

  10. 写一个简单的配置文件和日志管理(shell)

    最近在做一个Linux系统方案的设计,写了一个之前升级服务程序的配置和日志管理. 共4个文件,服务端一个UpdateServer.conf配置文件和一个UpdateServer脚本,客户端一个Upda ...