高级数据结构算法实例分析| 人工湖公路

简介: 高级数据结构算法实例分析

640.jpg

01、实例分析:人工湖公路

问题描述:

有一个湖,它的周围都是城市,但是由于水路不发达,所以在城市间来往都是靠陆地交通。很奇怪,每一个城市都只和与它相邻的城市建有公路,假设有n个城市,编号依次是1到n,那么编号为i的城市只和i%n+1,(i-2+n)%n+1两个城市有公路相连。公路是双向的,有的公路已坏,但是有的公路又会被工人修好。现在有人向你询问某两个城市是否可以互相到达。
输入:

第一行有两个数n和m(2≤n≤100000和1≤m≤100000),分别代表城市的数目和询问次数,接下来有m行,每一行一个标志数f和两个城市的编号x,y。

当f=0时,如果x,y之间的公路是好的,则x,y之间的公路会坏掉,否则x,y之间的公路将被修好。

当f=1时,代表那个人要向你询问x,y之间是否可以相互到达。

输入到文件结束。

输出:

对于每次询问,若x,y互相可以到达,则输出YES,否则输出NO。每个输出占一行。

输入样例:


5 10
1 2 5
0 4 5
1 4 5
0 2 3
1 3 4
1 1 3
0 1 2
0 2 3
1 2 4
1 2 5

输出样例:


YES
YES
YES
NO
YES
NO

解题思路:

(1) 这个题看似用一个搜索就可以解决,确实是可以得出正确答案,因为是否可以到达两个城市,无非有两种情况,画上圆后编号,顺时针走过去或者逆时针走过去,只要广度优先搜索就可以了,但是因为数据范围超限,故这种方法是行不通的。

(2) 这些城市之间的公路很奇怪,只有相邻的两个城市之间有公路,我们用1表示当前公路和它的下一条公路相连,用0表示不相连,那么,要知道两个城市是否相连,只要知道它们之间顺时针的1的个数是否等于它们之间顺时针间的城市个数就可以了,或者只要知道逆时针的1的个数是否等于它们之间逆时针间的城市个数就可以了。这时可采用快速求和的方法,如树状数组。

用一个数组记录当前这个城市是否和它的下一个城市相连,若相连,则将数组设置为1,否则设置为0,数组的第n个元素表示当前这个城市是否和第1个城市相连。这样就可以在询问两个城市是否相连时快速求出和了,但是需要求两次,若顺时针可以到达或者是逆时针可以到达,则是可以到达的,否则是不可以到达的。

参考程序:

#include< stdio.h>
#include<string.h>
int c[100001],ma[100001];
int lowbit(int t)
//位运算
return t&(-t);
void insert(int k,int d,int max)
while(k<=max)
c[k]+=d;
k= k+lowbit (k);
int getsum(int k)
//快速求和
int t=0;
while(k>0)
t+=c[k];
k-=lowbit(k);
1
return t;
int main()
int i,j,k,t,n;while(scanf("dd",&n,&k)!=EOF)memset(c,0,sizeof(c)) ;for(i=l;i<=n;i++)
insert(i,1,n);ma[i]=1;
//将 c 数组初始化
//起初任意城市间的公路都是完好的
//ma 数组记录当前城市是否和下一个城市相连
while(k--)
int a,b,f;scanf("号d%d%d",&f,&a,&b) ;if(f==0)
//若是好的公路,则毁坏;若是坏的公路,则修好
if(a>b) {
   
   t=a;a=b;b=t;}
if(b==n&&a==1)
{
   
   
if(ma[b]==1)
insert(b,-1,n);
ma[b]= 0;
else
insert(b,1,n);ma[b]= 1;
else
}
if (ma[a]==1)
insert(a,-1,n);
ma[a]= 0;
else
insert(a,1,n);
ma[a]= 1;
if(f==1)
//询问是否可以到达
if(a>b) {
   
   t=a;a=b;b=t;]int t1,t2,t3,t4;t1=getsum(a-1);t2=getsum(b-1);
int flag=0;
//判断顺时针是否可以到达if(t2-t1==b-a)
flag=1;
printf("YES\n");
if(!flag)
//判断逆时针是否可以到达
t3=getsum(n)-t2;if(t3+t1==n-b+a)printf("YES\n");flag=1;
if(!flag)
printf("NO\n");
目录
相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
57 1
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
102 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
5天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
14天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
26 6
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
115 23
|
2月前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
64 20
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
67 1
|
2月前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
61 0