第一章连通性问题-----algorithm in C 读书笔记
首先不得不吐槽一下翻译的质量,霍红卫。。。。你给我站出来,不打死你,只想问你一下,你当年四级过了吗?
- 问题描述
- 输入两个整数,代表两个节点,如果这两个整数没有建立连接(这包括直接连接和通过其他节点连接),那么我们就建立这两个节点之间的连接,否则,继续输入下一个节点
四个逐步改进的算法如下:
- //算法一
- #include <stdio.h>
- #define N 10
- int main(void)
- {
- int id[N];
- int t,i,p,q;
- //一定要初始化啊
- for(i=0;i<N;i++)
- {
- id[i] = i;
- }
- while( scanf("%d%d",&p,&q)==2 )
- {
- if( id[p]==id[q] )
- continue;
- t = id[p];
- for(i=0;i<N;i++)
- {
- if( id[i]==t )
- {
- id[i] = id[q];
- }
- }
- for(i=0;i<N;i++)
- {
- printf("%d\t",id[i]);
- }
- printf("\n");
- }
- return 0;
- }
这四个算法所使用的数据结构都是数组,算法一是把连接(包括直接连接和间接连接)在一起的整数所对应的数组元素都赋值为相同的值。
- //算法二
- #include <stdio.h>
- #define N 10
- int main(void)
- {
- int id[N];
- int i,j,p,q;
- for(i=0;i<N;i++)
- {
- id[i] = i;
- }
- while( scanf("%d%d",&p,&q)==2 )
- {
- //必须使用下面两次循环,否则当心陷入死循环
- for(i=p;id[i]!=i;i=id[i]);
- for(j=q;id[j]!=j;j=id[j]);
- if( i==j )
- continue;
- id[i] = j;
- for(i=0;i<N;i++)
- {
- printf("%d\t",id[i]);
- }
- printf("\n");
- }
- return 0;
- }
算法二采用的数据结构仍然是数组,但是逻辑上确实树的结构。我们首先根据输入的两个整数,分别找到其所在的树的根节点,然后检测两个节点所在的树的根节点是否相同,如果相同,就说明是同一棵树,否则就把这两个根节点连接起来。
- //算法三
- #include <stdio.h>
- #define N 10
- int main(void)
- {
- int id[N],sz[N];
- int p,q,i,j;
- for(i=0;i<N;i++)
- {
- id[i] = i;
- sz[i] = 1;
- }
- while( scanf("%d%d",&p,&q)==2 )
- {
- for(i=p;id[i]!=i;i=id[i]);
- for(j=q;id[j]!=j;j=id[j]);
- if( sz[i]<sz[j] )
- {
- id[i] = j;
- sz[j] += sz[i];
- }
- else
- {
- id[j] = i;
- sz[i] += sz[j];
- }
- printf("i=%d\nj=%d\n",i,j);
- for(i=0;i<N;i++)
- {
- printf("%d\t",sz[i]);
- }
- printf("\n");
- for(i=0;i<N;i++)
- {
- printf("%d\t",id[i]);
- }
- printf("\n");
- }
- return 0;
- }
算法三是在算法二的基础之上改进而来的,但是它添加了一个数据结构,记录以每个节点为根的树中的元素的个数。通过这个数据结构,每次都把小树连接到大树上,防止树的深度过深。
- //算法四
- #include <stdio.h>
- #define N 10
- int main(void)
- {
- int id[N];
- int sz[N];
- int p,q,i,j;
- //初始化
- for(i=0;i<N;i++)
- {
- id[i] = i;
- sz[i] = 1;
- }
- while( scanf("%d%d",&p,&q)==2 )
- {
- for(i=p;id[i]!=i;i=id[i])
- {
- id[i] = id[id[i]];
- }
- for(j=q;id[j]!=j;j=id[j])
- {
- id[j] = id[id[j]];
- }
- if( sz[i]<sz[j] )
- {
- id[i] = j;
- sz[j] += sz[i];
- }
- else
- {
- id[j] = i;
- sz[i] += sz[j];
- }
- printf("i=%d\nj=%d\n",i,j);
- for(i=0;i<N;i++)
- {
- printf("%d\t",sz[i]);
- }
- printf("\n");
- for(i=0;i<N;i++)
- {
- printf("%d\t",id[i]);
- }
- printf("\n");
- }
- return 0;
- }
算法四就是在算法三的基础之上又做了进一步的改进,将树的深度进一步的缩小。
第一章连通性问题-----algorithm in C 读书笔记的更多相关文章
- 《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记
第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...
- 连通性问题--Algorithms IN C读书笔记
近期在看<Algorithms IN C>这本书.刚開始看,读的是英文版的.感觉作者的叙述有点不太easy理解.就找了一本中文版的来看,发现还是看英文版的比較好.先看了第一章的大部分,后面 ...
- Java核心技术卷一基础知识-第3章-Java的基本程序设计结构-读书笔记
第3章 Java的基本程序设计结构 本章内容: 一个简单的Java应用程序 字符串 注释 输入输出 数据类型 控制流 变量 大数值 运算符 数组 本章主要讲述程序设计相关的基本概念(如数据类型.分支以 ...
- Javascript模式(第三章字面量与构造函数)------读书笔记
一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...
- 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记
docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...
- 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记
一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环 ...
- 第11章 UDP:用户数据报协-----读书笔记
1.分片应用程序只关心IP数据报的长度,如果它超过MTU值,那么就要对数据包进行分片. 2.UDP首部字段图: (16位源端口号+16位目端口号+16位UDP长度+16位UDP校验和+数据) 3.UD ...
随机推荐
- openwrt的编译系统是如何生成squashfs文件系统的
答:请看include/image.mk中的以下定义: define Image/mkfs/squashfs $(STAGING_DIR_HOST)/bin/mksquashfs4 $(call mk ...
- mybatis的注解开发之三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- Unity3D学习笔记(十九):UGUI、Image、Text、Button
UGUI:Unity官方最新,与NGUI同源 UI:User Interface(用户的操作界面),图片+文字 UGUI的组件: 1.创建UGUI组件时,会默认创建Canvas(画布)和EventSy ...
- Visual Studio 项目模板制作(一)
我们编写项目的时候,很多时候都是在写重复代码,比如一个比较完整的框架,然后下面有很多代码都是重复的Copy,其实我们可以利用Visual Studio的模板替我们干这些活,我们只要关注项目具体的业务就 ...
- python 连加
sum= number=int(input('请输入整数: ')) #递增for循环,从小到大打印出数字 print('从小到大排列输出数字:') ,number+): sum+=i #设置sum为i ...
- Goroutines和Channels(三)
clock服务器每一个连接都会起一个goroutine.在本节中我们会创建一个echo服务器,这个服务在每个连接中会有多个goroutine.大多数echo服务仅仅会返回他们读取到的内容,就像下面这个 ...
- c语言中的0UL或1UL是什么意思
0UL 表示 无符号长整型 0 1UL 表示 无符号长整型 1 如果不写UL后缀,系统默认为:int, 即,有符号整数. 1.数值常数有:整型常数.浮点常数:2.只有数值常数才有后缀说明:3.数值常数 ...
- 使用SFTP工具相关问题
1.使用SFTP工具,填写ip,端口都正确但是连接不上? 答:请统一使用 filezilla工具进行连接,环境搭建使用该工具进行测试和使用. 2.使用SFTP工具访 ...
- C++ 多态性和虚函数
2017-06-27 19:17:52 C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助. 一.多态的作用: 隐藏实现细节,使得代码能够模块化: 接口重用,实现“一个接 ...
- C#复制文件
string pLocalFilePath ="";//要复制的文件路径 string pSaveFilePath ="";//指定存储的路径 if (File ...