IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2018蓝桥杯省赛 真题 小朋友崇拜圈(DFS) -> 正文阅读

[数据结构与算法]2018蓝桥杯省赛 真题 小朋友崇拜圈(DFS)

看到该题的第一反应就是要使用DFS了,该题很明显地出现了DFS的特点——一条路走到底才回头

不过我还是没有完全掌握DFS,写出来的代码还结合了一点暴力(不过还好AC了)?

我的思路是用DFS去搜索每一个没有走过的路(或者说崇拜对象),直到某一个人的崇拜对象我已经走过的时候,我们就return,在搜索的过程中我们同时将每个人的崇拜对象输入一个vector中,然后搜索结束的时候我们就遍历这个vector(即我说的暴力,用了嵌套for循环),目的是找到这个vector中两个相同的崇拜对象的下标,然后我们发现这两个下标相减刚好就是他们形成的圈的人数,之后循环上面的这个过程,且比较前后的圈的大小,最后输出最大圈人数即可

值得注意的是我们每次dfs之前都要记得clear那个vector,还有对于已经走过的地方(崇拜对象),我们也不必再走,还有index1与index2记得每次搜索前都要初始化,不然可能出现数组越界情况(最好自己调试)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
#include<cmath>
using namespace std;
vector<int> v;
const int MAX = 100005;
int per[MAX];
int book[MAX] = { 0 };
int cn = 0;
void dfs(int per[], int book[], int x, int n)
{
	if (book[x] == 1)
	{
		v.push_back(x);
		return ;
	}

	book[x] = 1;
	v.push_back(x);
	dfs(per, book, per[x], n);
	return ;
}

int main()
{
	int n, max_per = 0, index1=0, index2=1,i,j,z;
	cin >> n;
	for ( i = 1; i <= n; i++)
	{
		cin >> per[i];
	}
	for ( i = 1; i <= n; i++)
	{
		v.clear();
		if (!book[i])
		{
			index1 = 0;
			index2 = 1;
			dfs(per, book, i, n);
			for ( z = 0; z < v.size(); z++)
			{
				for ( j = 0; j < v.size(); j++)
				{
					if (z == j)
					{
						continue;
					}
					if (v[z] == v[j])
					{
						index1 = z;
						index2 = j;
						break;
					}
				}
				if (v[index1] == v[index2])
				{
					break;
				}
			}
			max_per = max(max_per, (index2 - index1));
		}
	}

	cout << max_per << endl;
	return 0;
}

总的来说自己写的这个DFS还是太冗长了(不够精炼),还是要多做题~~~?

下面是原题给出的题解(很简洁)

该思路:我们发现我们得到的数据肯定都至少会形成一个“崇拜圈”,而且必然会有“从哪里来回哪里去”的情况,那么不妨我们就一个一个试,遍历每一个孩子作为崇拜圈的起点,如果可以回到起点,我们就记录下来并且在后面找到新的崇拜圈的时候更新最大值(记得每次dfs之前需要将visited重新初始化)


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
#include<cmath>
using namespace std;
int a[100005];
int n, ans = 0;
int vt[100005];
void dfs(int x, int y, int t) {
	if (x == y) {//回到起点
		ans = max(ans, t);
		return;
	}
	if (!vt[x]) {
		vt[x] = 1;
		dfs(a[x], y, t + 1);
	}
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		memset(vt, 0, sizeof(vt));
		vt[i] = 1;
		dfs(a[i], i, 1);
	}
	cout << ans << endl;
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:26:29  更:2022-03-11 22:28:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:54:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码