搜索专题题解

题目链接:

  codeforces 277A - Learning Languages

题目描述:

  一个团体有n个人,每个人都掌握了一些语言,每个人学一门语言有1个花费,两个人之间可以通过其他人的翻译,问最少花费多少使得这个团体的任意两个人都可以交流?

解题思路:

  可以bfs,dfs求连通块,也可以用并查集求集合数目。(PS:唯一要注意的是当每一个人都是只会0种语言,辣么每个人是不是都要学习语言,特判一下就好辣)

 搜索专题,先贴dfs代码咯~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 205;
 4 struct Edge//邻接表建图,dfs求连通块数目
 5 {
 6     int to, next;
 7 };
 8 
 9 Edge edge[maxn*maxn];
10 int head[maxn], vis[maxn], tot;
11 
12 void Add (int from, int to)
13 {
14     edge[tot].to = to;
15     edge[tot].next = head[from];
16     head[from] = tot ++;
17 }
18 void dfs (int x)
19 {
20     vis[x] = 1;
21     for (int i=head[x]; i!=-1; i=edge[i].next)
22         if (!vis[edge[i].to])
23             dfs (edge[i].to);
24 }
25 
26 int main ()
27 {
28     int n, m;
29     while (scanf ("%d %d", &n, &m) != EOF)
30     {
31         int k, num, sum = 0;
32         tot = 0;
33         memset (head, -1, sizeof(head));
34         memset (edge, 0, sizeof(edge));
35         memset (vis, 0, sizeof(vis));
36         for (int i=0; i<n; i++)
37         {
38             scanf ("%d", &k);
39             sum += k;
40             while (k --)
41             {
42                 scanf ("%d", &num);
43                 Add (i, num+n-1);
44                 Add (num+n-1, i);
45             }
46         }
47         num = 0;
48         for (int i=0; i<n; i++)
49             if (!vis[i])
50             {
51                 dfs(i);
52                 num ++;
53             }
54         if (sum)
55             num --;
56         printf ("%d\n", num);
57     }
58     return 0;
59 }
View Code

 

再贴一个并查集代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 205;
 4 int father[maxn], n, m;
 5 
 6 void init ()
 7 {
 8     for (int i=0; i<maxn; i++)
 9         father[i] = i;
10 }
11 int find (int x)
12 {
13     if (father[x] != x)
14         father[x] = find (father[x]);
15     return father[x];
16 }
17 int main ()
18 {
19     while (scanf ("%d %d", &n, &m) != EOF)
20     {
21         init ();
22         int k, x, ans = 0;
23         for (int i=1; i<=n; i++)
24         {
25             scanf ("%d", &k);
26             if (k)
27                 ans = -1;
28             while (k --)
29             {
30                 scanf ("%d", &x);
31                 int pi = find(i);
32                 int px = find(x+n);
33                 if (pi != px)
34                     father[px] = father[pi];
35             }
36         }
37         for (int i=1; i<=n; i++)
38             if (father[i] == i)
39             ans ++;
40         printf ("%d\n", ans);
41     }
42     return 0;
43 }
View Code

 —————————————————————————————————————我是华丽的分割线——————————————————————————————————

题目链接:

  codeforce 520B - Two Buttons

题目描述:

  有n,m两个数,现有两种操作:

    1:n可以*2;2:n可以减1。问最少操作多少次可以使n==m?

解题思路:

  这次是最优解,又是搜索专题,肯定是bfs咯,tle的估计就是vis数组出问题咯,还有要注意n,m的范围哟!

还是先贴bfs代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 10005;
 4 struct node
 5 {
 6     int x, step;
 7 };
 8 int bfs (int n, int m)
 9 {
10     node p, q;
11     queue <node> Q;
12     int vis[maxn];
13     memset (vis, 0, sizeof(vis));
14     vis[n] = 1;
15     p.x = n;
16     p.step = 0;
17     Q.push (p);
18     while (!Q.empty())
19     {
20         p = Q.front();
21         Q.pop();
22         if (p.x == m)
23             return p.step;
24         q.step = p.step + 1;
25         int x = p.x - 1;
26         int y = p.x * 2;
27         if (x > 0 && !vis[x])
28         {
29             q.x = x;
30             Q.push (q);
31             vis[x] = 1;
32         }
33         if (p.x<m && y<maxn && !vis[y])
34         {
35             q.x = y;
36             Q.push (q);
37             vis[y] = 1;
38         }
39     }
40 }
41 int main ()
42 {
43     int n, m;
44     while (scanf ("%d %d", &n, &m) != EOF)
45         printf ("%d\n", bfs(n, m));
46     return 0;
47 }
View Code

再贴一个代码,这个代码简单易懂

 1 /*这个要进行逆向思维
 2   这时候要考虑把m-->n
 3   两种操作就变成了m/2与m+1
 4   当m>n的时候只能进行+1操作
 5   当m<n的时候只能进行/2操作(要讨论m的奇偶性)
 6   循环操作,m==n的时候就一切ok啦
 7 */
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 const int maxn = 10005;
11 int main ()
12 {
13     int n, m, ans;
14     while (scanf ("%d %d", &n, &m) != EOF)
15     {
16         ans = 0;
17         while (true)
18         {
19             if (m <= n)
20             {
21                 ans += n - m;
22                 break;
23             }
24             if (m%2)
25             {
26                 m ++;
27                 ans ++;
28             }
29             m /= 2;
30             ans ++;
31         }
32         printf ("%d\n", ans);
33     }
34     return 0;
35 }
View Code

这两个题目都可以用其他方法做,完美的避开了搜索,不知道会不会对小学弟(美)们造成误导哦,还是声明一下搜索很重要的,搜索很重要的,搜索很重要的(重要的事情说三遍)。是很多其他算法的基础。

 

————————————————————————————————————我是邪魅温柔的分割线——————————————————————————————

 

题目链接:

  Codeforces 445B - DZY Loves Chemistry

题目描述:

  n种试剂,m种反应(反应发生在两种试剂之间),DZY想要把这n种试剂混合,DZY依次向试管中加入试剂,刚开始试管的危险系数为1,如果当前所需要加入的试剂能与试管中的某种试剂反应,则试管的危险系数乘二,现在为了安全起见,问试管最高的危险系数是多少?

解题思路:

  很裸地并查集嘛!因为最终的状态肯定是所有的试剂都在试管里面,只需要知道每个集合里面元素个数就OK啦!!

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 typedef __int64 LL;
 8 const int maxn = 100;
 9 int father[maxn];
10 void init ()
11 {
12     for (int i=0; i<maxn; i++)
13         father[i] = i;
14 }
15 int Find(int x)
16 {
17     if (x != father[x])
18         father[x] = Find(father[x]);
19     return father[x];
20 }
21 int main ()
22 {
23     int n, m;
24     while (scanf ("%d %d", &n, &m) != EOF)
25     {
26         init ();
27         LL ans = 1;
28         while (m --)
29         {
30             int x, y;
31             scanf ("%d %d", &x, &y);
32             int px = Find (x);
33             int py = Find (y);
34             if (px != py)
35             {
36                 father[px] = py;
37                 ans *= 2;
38             }
39         }
40         printf ("%I64d\n", ans);
41     }
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/alihenaixiao/p/4653579.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook 开源的快速文本分类器 FastTex

FastText是Facebook开发的一款快速文本分类器&#xff0c;提供简单而高效的文本分类和表征学习的方法&#xff0c;性能比肩深度学习而且速度更快。 fastText 原理fastText 方法包含三部分&#xff1a;模型架构、层次 Softmax 和 N-gram 特征。下面我们一一介绍。 1.1 模型架构 …

FCN-加载训练与测试数据

当我们生成了数据后&#xff0c;我们来看看FCN是如何加载数据的。 FCN 代码预览 其中&#xff1a; - data : 训练测试数据 - ilsvrc-nets&#xff1a;存放预训练的模型 - 剩下的框&#xff1a;不同数据集的训练测试prototxt - voc_layers&#xff0c;siftflow_layers等&am…

怎么撤销定时说说_已注册商标遇到撤三申请怎么办

很多企业的商标都遇到过商标撤三的情况&#xff0c;撤三简单的说就是&#xff0c;注册商标没有正当理由连续三年不使用的&#xff0c;任何单位或者个人可以向商标局申请撤销该注册商标。所以说&#xff0c;无论您的企业多大&#xff0c;商标持有的再多&#xff0c;也要做好商标…

Spartan-6 FPGA SelectIO Resources User Guide 笔记2 SelectIO Attributes/Constraints

1.Location Constraint 用于分配I/O端口 NET <I/O_NAME> LOC "<EXTERNAL_PORT_IDENTIFIER>"; Example: NET MY_IO LOCR7; 2.IOSTANDARD Attribute 用于选择IO标准如LVCMOS25&#xff0c;LVDS_25等 NET <I/O_NAME> IOSTANDARD”<IOSTANDARD V…

正则表达式及其在python上的应用

今天学习了一早上正则表达式。如下内容部分转载自《读懂正则表达式就这么简单》 一、什么是正则表达式 正则表达式是一种特殊的字符串模式&#xff0c;用于匹配一组字符串&#xff0c;就好比用模具做产品&#xff0c;而正则就是这个模具&#xff0c;定义一种规则去匹配符合规…

安全专家在硬盘固件中发现NSA的网络间谍程序

本周安全专家在硬盘固件中发现了美国国家安全局&#xff08;NSA&#xff09;的网络间谍程序&#xff0c;这些程序非常难以被检测或者删除。来自卡巴斯基的研究者公布了该恶意程序用来“Phone Home”的URL地址&#xff0c;NSA利用这些随机、凌乱的地址来收集硬盘上的敏感数据。 …

SVN 分支/合并/切换

本文无条理性&#xff0c;仅作自我参考。 花费了两个半下午&#xff0c;走马观花的看了一下说明文档&#xff0c;SVN设计的太复杂&#xff0c;对我这样的&#xff0c;不在一个集体的的业余开发者&#xff0c;要理解起来真是太难了。。。。 分支 Make branches as often as yo…

关于FCN的数据集着色说明

前方我们讲解了《 FCN-数据篇》。里面包含了如何制作类似pascal voc的label。很大篇幅在谈如何着色&#xff0c;如何转化为索引图像。 由于一些内容参考网上的资料&#xff0c;所以对里面的一些操作含义也有些糊涂。 其实网上的东西也不都对&#xff0c;很多人云亦云。所以需要…

Android Property Animation动画

3.0以前&#xff0c;android支持两种动画模式&#xff0c;tween animation,frame animation&#xff0c;在android3.0中又引入了一个新的动画系统&#xff1a;property animation&#xff0c;这三种动画模式在SDK中被称为property animation,view animation,drawable animation…

Ubuntu14.04下Mongodb数据库可视化工具安装部署步骤(图文详解)(博主推荐)

不多说&#xff0c;直接上干货&#xff01; 前期博客 Ubuntu14.04下Mongodb&#xff08;离线安装方式|非apt-get&#xff09;安装部署步骤&#xff08;图文详解&#xff09;&#xff08;博主推荐&#xff09; Ubuntu14.04下Mongodb官网安装部署步骤&#xff08;图文详解&#x…

tensorboard使用_colab打不开tensorboard的解决办法

2020.4.1更新&#xff1a;colab现在自带tensorboard的魔术方法了&#xff0c;用这个命令就能展示tensorboard%load_ext tensorboard %tensorboard --logdir ./log/train# 加载一次后&#xff0c;如果要重新加载&#xff0c;就需要使用reload方法 %reload_ext tensorboard %tens…

小程序“自定义关键词”功能的常见问答

我们知道小程序可以通过线下扫码、公众号、好友分享、长按小程序码、搜索小程序名称来找到&#xff0c;现在又多了一个新方式——小程序后台新增自定义关键词功能&#xff1a;已发布小程序的开发者&#xff0c;可提交最多10个与小程序业务相关的关键词&#xff0c;帮助你的小程…

语义分割深度学习方法集锦

转载&#xff1a;https://github.com/handong1587/handong1587.github.io/edit/master/_posts/deep_learning/2015-10-09-segmentation.md Papers Deep Joint Task Learning for Generic Object Extraction intro: NIPS 2014homepage: http://vision.sysu.edu.cn/projects/d…

员工培训与开发实训心得体会_公司新员工培训心得体会800字范文

点击蓝字关注我们培训是一次能够快速提升我们的机会&#xff0c;而每个新员工也是通过培训尽快的融入公司的。因此&#xff0c;我们要更加重视培训一些!下面是小编为大家整理的公司新员工培训心得体会&#xff0c;希望对大家有帮助。公司新员工培训心得体会800字为了让我们新进…

Nginx ab压力测试

20-ab压力测试及nginx性能统计模块 优化的启发&#xff0c;打开的文件太多 Nginx 错误日志显示&#xff0c;打开文件数太多 系统层面 more /proc/sys/net/core/somaxconn 单个Nginx 测试index.html 没优化前 [root/home/www]#ab -c 4000 -n 100000 http://test.demo.com/inde…

Code First02---CodeFirst配置实体与数据库映射的两种方式

Code First有两种配置数据库映射的方式&#xff0c;一种是使用数据属性DataAnnotation&#xff0c;另一种是Fluent API.这两种方式分别是什么呢&#xff1f;下面进行一一解释&#xff1a;DataAnnotation的配置方式需要你给定义实体和值对象的类和类中的属性加上与数据库映射相关…

sigmoid函数的数值稳定性

在深度学习中&#xff0c;我们常常选用sigmoid函数作为激活函数。sigmoid函数的具体形式如下&#xff1a; f(x)11e−xf(x)=\frac{1}{1+e^{-x}}曲线表示为&#xff1a; 再画大一点&#xff0c;取x区间更大一些&#xff0c;则为&#xff1a; 显然从图像上看&#xff0c;sigmoid函…

windows远程连接ubuntu 黑屏_Windows跟Windows远程连接传输文件

关注奕奇科技&#xff0c;学习更多小妙招电脑小知识&#xff0c;值得收藏我们一般在使用windows远程连接时需要传输文件该怎么办&#xff1f;我们可以插入U盘导入导出&#xff0c;但这样很是麻烦而且如果身边暂时没有U盘的情况就要通过社交工具传播文件&#xff0c;大的文件也更…

思维导图分析http之前端组成

思维导图分析http前端组成全文总览本文分为三个部分&#xff1a;前端组成&#xff0c;http协议&#xff0c;http服务器应用程序。http的应用按照我自己的理解分为前端应用以及后端应用&#xff0c;所以我分别写了前端组成以及http服务器应用程序两章&#xff0c;中间穿插了一章…

caffe 关于Deconvolution的初始化注意事项

对于fcn&#xff0c;经常要使用到Deconvolution进行上采样。对于caffe使用者&#xff0c;使用Deconvolution上采样&#xff0c;其参数往往直接给定&#xff0c;不需要通过学习获得。 给定参数的方式很有意思&#xff0c;可以通过两种方式实现&#xff0c;但是这两种方式并非完…