Floyd判圈算法
来源:互联网 发布:农产品网络销售 编辑:程序博客网 时间:2024/04/30 18:51
参考:http://blog.csdn.net/javasus/article/details/50015687
Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm)。该算法由美国科学家罗伯特·弗洛伊德发明,是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,求出该环的起点与长度的算法。
如果有限状态机、迭代函数或者链表上存在环,那么在某个环上以不同速度前进的2个指针必定会在某个时刻相遇。同时显然地,如果从同一个起点(即使这个起点不在某个环上)同时开始以不同速度前进的2个指针最终相遇,那么可以判定存在一个环,且可以求出2者相遇处所在的环的起点与长度。
算法描述
如果有限状态机、迭代函数或者链表存在环,那么一定存在一个起点可以到达某个环的某处(这个起点也可以在某个环上)。
初始状态下,假设已知某个起点节点为节点S。现设两个指针t和h,将它们均指向S。
接着,同时让t和h往前推进,但是二者的速度不同:t每前进1步,h前进2步。只要二者都可以前进而且没有相遇,就如此保持二者的推进。当h无法前进,即到达某个没有后继的节点时,就可以确定从S出发不会遇到环。反之当t与h再次相遇时,就可以确定从S出发一定会进入某个环,设其为环C。
如果确定了存在某个环,就可以求此环的起点与长度。
计算环长度
上述算法刚判断出存在环C时,显然t和h位于同一节点,设其为节点M。显然,仅需令h不动,而t不断推进,最终又会返回节点M,统计这一次t推进的步数,显然这就是环C的长度。
计算环起点
为了求出环C的起点,只要令h仍位于节点M,而令t返回起点节点S。随后,同时让t和h往前推进,且保持二者的速度相同:t每前进1步,h前进1步。持续该过程直至t与h再一次相遇,设此次相遇时位于同一节点P,则节点P即为从节点S出发所到达的环C的第一个节点,即环C的一个起点。
//以上都是套路,无解释。
题目:Gym - 101252D
链接:https://vjudge.net/problem/Gym-101252D
题解:裸的Floyd判圈算法
代码:
//#include<bits/stdc++.h>#include <iostream>#include <string>#include <queue>#include <map>#include <cstring>#include <cstdio>using namespace std;typedef long long LL;const int MAXN = 2*10000000;int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); int t; t = 0; LL a, b, c, x = 1, y = 1; scanf("%I64d%I64d%I64d", &a, &b, &c); while(t < MAXN) { t++; y = (a*y+y%b)%c; y = (a*y+y%b)%c; x = (a*x+x%b)%c; if (x == y) break; } if (x != y) { puts("-1"); return 0; } int r = 0; while(r < MAXN) { y = (a*y+y%b)%c; r++; if (x == y) break; } if (x != y) { puts("-1"); return 0; } t = 0; y = 1; while(x != y && t < MAXN) { t++; y = (a*y+y%b)%c; x = (a*x+x%b)%c; } t += r; if (x == y && t <= MAXN) { printf("%d\n", t); } else puts("-1"); return 0;}
- Floyd判圈算法
- Floyd判圈算法
- floyd判圈算法
- Floyd判圈算法
- Floyd 判圈 算法
- Floyd判圈算法
- Floyd判圈算法
- Floyd判圈算法
- floyd判圈算法
- Floyd 判圈算法
- 关于Floyd判圈算法
- Floyd判圈算法理解
- Floyd判圈算法【区庆亮】
- Floyd判圈算法理解
- Floyd判圈算法理解
- 算法-floyd判环(圈)算法
- UVA11549(Floyd判圈算法)
- UVa11549 - Calculator Conundrum(Floyd判圈算法)
- 5种颜色球,抽出3种颜色不一样的组合(enum 枚举)
- MySQL之——服务器调优思路
- angularjs指令-赋值
- Tkinter 学习笔记 —— 第一个应用程序
- Unity中Update和FixedUpdate的区别
- Floyd判圈算法
- linux下的几种进程间通信方式的特点
- 关于集成Bmob遇到的坑
- 7. NodeMCU上使用RTOS固件读取bh1750传感器数据的实践
- html,xml,json入门Ajax例子
- Establishing SSL connection without server's identity verification is not recommended
- 设计模式之代理模式
- <s:property>
- angularjs指令-控制器