记录编号 209590 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015]信息传递 最终得分 100
用户昵称 GravatarTCtower 是否通过 通过
代码语言 C++ 运行时间 0.184 s
提交时间 2015-11-22 21:23:30 内存使用 4.14 MiB
显示代码纯文本
  1. /*
  2. 昔日龌龊不足夸,今朝放荡思无涯。
  3. 春风得意马蹄疾,一日看尽长安花。
  4. */
  5. #include <iostream>
  6. #include <cstdio>
  7. #include <cstring>
  8. #include <ctime>
  9. #include <cmath>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <stack>
  13. #define LOCAL
  14. //#pragma comment(linker, "/STACK:10240000000,10240000000")
  15. const int MAXN = 200000 + 200;
  16. using namespace std;
  17. int V[MAXN];
  18. int dfn[MAXN], low[MAXN], n, m;
  19. int vis[MAXN], pos, cnt[MAXN], x;//标记是否已经出栈
  20. stack<int> S;
  21.  
  22. void init(){
  23. scanf("%d", &n);
  24. for (int i = 1; i <= n; i++) scanf("%d", &V[i]);
  25. memset(dfn, 0, sizeof(dfn));
  26. memset(low, 0, sizeof(low));
  27. memset(vis, 0, sizeof(vis));
  28. pos = 0;
  29. }
  30. void dfs(int u, int num){
  31. dfn[u] = low[u] = num;
  32. //printf("%d\n", dfn[3]);
  33. //printf("%d\n", num);
  34. S.push(u);
  35. if (vis[V[u]]) goto w;//不要找
  36. if (dfn[V[u]] == 0){
  37. dfs(V[u], num + 1);
  38. low[u] = min(low[u], low[V[u]]);
  39. }else low[u] = min(low[u], dfn[V[u]]);
  40. w:if (dfn[u] == low[u]){
  41. pos++;
  42. cnt[pos] = 0;
  43. do{
  44. x = S.top();
  45. S.pop();
  46. vis[x] = 1;
  47. cnt[pos]++;
  48. }while (x != u);
  49. }
  50. return;
  51. }
  52.  
  53. int main(){
  54. #ifdef LOCAL
  55. freopen("2015message.in", "r", stdin);
  56. freopen("2015message.out", "w", stdout);
  57. #endif
  58.  
  59. init();
  60. for (int i = 1; i <= n; i++){
  61. if (vis[i]) continue;
  62. dfs(i, 1);
  63. }
  64. int Ans = n;
  65. for (int i = 1; i <= pos; i++) if (cnt[i] != 1) Ans = min(Ans, cnt[i]);
  66. printf("%d\n", Ans);
  67. return 0;
  68. }