首先不得不吐槽一下翻译的质量,霍红卫。。。。你给我站出来,不打死你,只想问你一下,你当年四级过了吗?

  1. 问题描述
  2. 输入两个整数,代表两个节点,如果这两个整数没有建立连接(这包括直接连接和通过其他节点连接),那么我们就建立这两个节点之间的连接,否则,继续输入下一个节点
 

四个逐步改进的算法如下:

  1. //算法一
  2. #include <stdio.h>
  3. #define N 10
  4. int main(void)
  5. {
  6. int id[N];
  7. int t,i,p,q;
  8. //一定要初始化啊
  9. for(i=0;i<N;i++)
  10. {
  11. id[i] = i;
  12. }
  13. while( scanf("%d%d",&p,&q)==2 )
  14. {
  15. if( id[p]==id[q] )
  16. continue;
  17. t = id[p];
  18. for(i=0;i<N;i++)
  19. {
  20. if( id[i]==t )
  21. {
  22. id[i] = id[q];
  23. }
  24. }
  25. for(i=0;i<N;i++)
  26. {
  27. printf("%d\t",id[i]);
  28. }
  29. printf("\n");
  30. }
  31. return 0;
  32. }

这四个算法所使用的数据结构都是数组,算法一是把连接(包括直接连接和间接连接)在一起的整数所对应的数组元素都赋值为相同的值。

  1. //算法二
  2. #include <stdio.h>
  3. #define N 10
  4. int main(void)
  5. {
  6. int id[N];
  7. int i,j,p,q;
  8. for(i=0;i<N;i++)
  9. {
  10. id[i] = i;
  11. }
  12. while( scanf("%d%d",&p,&q)==2 )
  13. {
  14. //必须使用下面两次循环,否则当心陷入死循环
  15. for(i=p;id[i]!=i;i=id[i]);
  16. for(j=q;id[j]!=j;j=id[j]);
  17. if( i==j )
  18. continue;
  19. id[i] = j;
  20. for(i=0;i<N;i++)
  21. {
  22. printf("%d\t",id[i]);
  23. }
  24. printf("\n");
  25. }
  26. return 0;
  27. }

算法二采用的数据结构仍然是数组,但是逻辑上确实树的结构。我们首先根据输入的两个整数,分别找到其所在的树的根节点,然后检测两个节点所在的树的根节点是否相同,如果相同,就说明是同一棵树,否则就把这两个根节点连接起来。

  1. //算法三
  2. #include <stdio.h>
  3. #define N 10
  4. int main(void)
  5. {
  6. int id[N],sz[N];
  7. int p,q,i,j;
  8. for(i=0;i<N;i++)
  9. {
  10. id[i] = i;
  11. sz[i] = 1;
  12. }
  13. while( scanf("%d%d",&p,&q)==2 )
  14. {
  15. for(i=p;id[i]!=i;i=id[i]);
  16. for(j=q;id[j]!=j;j=id[j]);
  17. if( sz[i]<sz[j] )
  18. {
  19. id[i] = j;
  20. sz[j] += sz[i];
  21. }
  22. else
  23. {
  24. id[j] = i;
  25. sz[i] += sz[j];
  26. }
  27. printf("i=%d\nj=%d\n",i,j);
  28. for(i=0;i<N;i++)
  29. {
  30. printf("%d\t",sz[i]);
  31. }
  32. printf("\n");
  33. for(i=0;i<N;i++)
  34. {
  35. printf("%d\t",id[i]);
  36. }
  37. printf("\n");
  38. }
  39. return 0;
  40. }

算法三是在算法二的基础之上改进而来的,但是它添加了一个数据结构,记录以每个节点为根的树中的元素的个数。通过这个数据结构,每次都把小树连接到大树上,防止树的深度过深。

  1. //算法四
  2. #include <stdio.h>
  3. #define N 10
  4. int main(void)
  5. {
  6. int id[N];
  7. int sz[N];
  8. int p,q,i,j;
  9. //初始化
  10. for(i=0;i<N;i++)
  11. {
  12. id[i] = i;
  13. sz[i] = 1;
  14. }
  15. while( scanf("%d%d",&p,&q)==2 )
  16. {
  17. for(i=p;id[i]!=i;i=id[i])
  18. {
  19. id[i] = id[id[i]];
  20. }
  21. for(j=q;id[j]!=j;j=id[j])
  22. {
  23. id[j] = id[id[j]];
  24. }
  25. if( sz[i]<sz[j] )
  26. {
  27. id[i] = j;
  28. sz[j] += sz[i];
  29. }
  30. else
  31. {
  32. id[j] = i;
  33. sz[i] += sz[j];
  34. }
  35. printf("i=%d\nj=%d\n",i,j);
  36. for(i=0;i<N;i++)
  37. {
  38. printf("%d\t",sz[i]);
  39. }
  40. printf("\n");
  41. for(i=0;i<N;i++)
  42. {
  43. printf("%d\t",id[i]);
  44. }
  45. printf("\n");
  46. }
  47. return 0;
  48. }

算法四就是在算法三的基础之上又做了进一步的改进,将树的深度进一步的缩小。

第一章连通性问题-----algorithm in C 读书笔记的更多相关文章

  1. 《TCP/IP详解卷1:协议》第11章 UDP:用户数据报协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. 《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  3. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  4. 连通性问题--Algorithms IN C读书笔记

    近期在看<Algorithms IN C>这本书.刚開始看,读的是英文版的.感觉作者的叙述有点不太easy理解.就找了一本中文版的来看,发现还是看英文版的比較好.先看了第一章的大部分,后面 ...

  5. Java核心技术卷一基础知识-第3章-Java的基本程序设计结构-读书笔记

    第3章 Java的基本程序设计结构 本章内容: 一个简单的Java应用程序 字符串 注释 输入输出 数据类型 控制流 变量 大数值 运算符 数组 本章主要讲述程序设计相关的基本概念(如数据类型.分支以 ...

  6. Javascript模式(第三章字面量与构造函数)------读书笔记

    一 对象字面量 1.1对象字面量的语法 1,对象键值对哈希表,在其他的编程语言中称之为“关联数组”, 2 键值对里面的值,可以是原始类型也可以是其他类型的对象,称之为属性,函数称之为方法 3 自定义对 ...

  7. 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记

    docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...

  8. 《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

    一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环 ...

  9. 第11章 UDP:用户数据报协-----读书笔记

    1.分片应用程序只关心IP数据报的长度,如果它超过MTU值,那么就要对数据包进行分片. 2.UDP首部字段图: (16位源端口号+16位目端口号+16位UDP长度+16位UDP校验和+数据) 3.UD ...

随机推荐

  1. Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

  2. 不同ContentType的post请求

    public static T Invoke<T>(string url, object input, bool requireJSON = true) { using (var clie ...

  3. BZOJ2662: [BeiJing wc2012]冻结 spfa+分层图

    Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”        在这个愿望被实现以后的世界里,人们享 ...

  4. Apache Kylin大数据分析平台的演进

    转:http://mt.sohu.com/20160628/n456602429.shtml 我是来自Kyligence的李扬,是上海Kyligence的联合创始人兼CTO.今天我主要来和大家分享一下 ...

  5. Source not found :Edit Source Lookup Path 解决方案

    作者原创,转载请注明转载地址 在eclipse中用debug调试的时候,出现了以下问题,很是尴尬,经常碰到,所以有必要进行总结一下: 对该问题有两种解决方案, 一种比较文明:解决方法可参考如下网址: ...

  6. 【转载】TCP 与 UDP 的区别

    原文地址:TCP 与 UDP 的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信 ...

  7. css未知宽高的盒子div居中的多种方法

    不知道盒子大小.宽高时,如何让盒子上下左右居中? 应用场景:比如上传图片时,并不知道图片的大小,但要求图片显示在某盒子的正中央. 方法1:让4周的拉力均匀-常用 <!-- Author: Xia ...

  8. Jmeter 同一个测试计划下的多个线程组 执行顺序 希望调整为顺序执行

    用Jmeter做自动化测试,一个测试计划中添加多个线程组, 每个线程组的功能测试,希望是一个线程组执行完毕后,接着执行下一个线程组下的请求 Jmeter默认多个线程组之间是并行关系 需要在测试计划下勾 ...

  9. Thunder团队Final版本控制

    Final版本控制报告 团队介绍:Thunder Check in次数 :6次. check in log(时间.人员.message.动机.其他解释) 代码贡献量.代码贡献比例以及代码作用 git链 ...

  10. Android手机摄像头编程入门

    本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制, 做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别, ...