博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codefores741A Arpa's loud Owf and Mehrdad's evil plan(图找环)
阅读量:6988 次
发布时间:2019-06-27

本文共 1292 字,大约阅读时间需要 4 分钟。

题意:

对于给定的一个数列a[n],如果现在点i,那么下一个点就在a[i],现在问给定n个点,找到一个最小的t,使得对于从任意一个点x出发,经过t次之后,到达的点y, 使得点y经过t次之后会回到点x。

要点:

一看就是图找环,找到所有独立的环对应的节点数,对所有节点数求最小公倍数就是结果。有个地方要注意就是,当节点数是偶数时,比如1->2->3->4->1,这种情况要将节点数/2计算,因为比如1到达3要2次,3到达1也是两次,肯定比从1绕一圈再到1要小,奇数没有办法。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = 105;int a[N], vis[N];ll b[N];int dfs(int u, int s, int l)//有向图找环{ if (u == s) { l = l + 1; return l; } if (vis[u] && u != s) { return -1; } vis[u] = 1; if (a[u] == s) return dfs(a[u], s, l); else return dfs(a[u], s, l + 1);}ll gcd(ll a, ll b){ if (b == 0) return a; return gcd(b, a%b);}int main(){ int n; scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); memset(vis, 0, sizeof(vis)); int cnt = 0; bool flag = true; for (int i = 1; i <= n; i++) { if (vis[i]) continue; int temp = dfs(a[i], i, 1); if (temp != -1) { if (temp % 2 == 0) temp /= 2; b[cnt++] = temp; } else { flag = false; break; } } if (!flag) printf("-1\n"); else { ll lcm, c = b[0], e; for (int i = 0; i < cnt; i++)//计算lcm { e = gcd(c, b[i]); lcm = c*b[i] / e; c = lcm; } printf("%I64d\n", lcm); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343651.html

你可能感兴趣的文章
大道至简,职场上做人做事做管理
查看>>
make 参数定义
查看>>
java从字符串中提取数字
查看>>
Android深入浅出系列之服务机制—1.Android中的Service
查看>>
MVC、MVP以及Model2[上篇]
查看>>
数据库隐式类型转换
查看>>
分享5个主流的HTML5开发工具
查看>>
基于Ionic2的开源项目
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
周锦民:腾讯在线教育视频互动直播间技术实践
查看>>
[转]UML类图、关系及其JAVA代码
查看>>
PhotoShop算法原理解析系列 - 像素化---》碎片。
查看>>
设计模式之责任链模式
查看>>
php多态设计
查看>>
CSS格式化 CSS代码压缩工具
查看>>
mvc伪静态<三> IIS配置
查看>>
Visual Studio中的lib的链接顺序
查看>>
android自定义radiobutton样式文字颜色随选中状态而改变
查看>>
【CodeForces 604B】F - 一般水的题1-More Cowbe
查看>>
wxPython 4.0.0b2安装
查看>>