zoukankan      html  css  js  c++  java
  • 信息传递(tarjan)

    信息传递

    http://uoj.ac/problem/146

    有 n 个同学(编号为 1 到n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i的同学的信息传递对象是编号为 Ti 的同学。

    游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自 己的生日时,游戏结束。请问该游戏一共可以进行几轮?

    输入格式

    输入共2行。 第1行包含1个正整数 n ,表示 n 个人。

    第2行包含 n 个用空格隔开的正整数 T1,T2,,Tn其中第 i 个整数 Ti 表示编号为 i 的同学的信息传递对象是编号为 Ti 的同学, Tin 且 Ti≠i 。

    数据保证游戏一定会结束。

    输出格式

    输出共1行,包含1个整数,表示游戏一共可以进行多少轮。

    样例一

    input

    5
    2 4 2 3 1
    
    

    output

    3
    

    tarjan模板题

     1 #include<iostream>
     2 #include<cstring>
     3 #include<string>
     4 #include<cmath>
     5 #include<cstdio>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #include<stack>
    10 #include<set>
    11 using namespace std;
    12 const int maxn=2e5+5;
    13 vector<int>ve[maxn];
    14 int n,dfn[maxn],low[maxn],vis[maxn],tot,ans=maxn;
    15 stack<int>st;
    16 void tarjan(int x){
    17     low[x]=dfn[x]=++tot;
    18     st.push(x);
    19     vis[x]=1;
    20     for(int i=0;i<ve[x].size();i++){
    21         int v=ve[x][i];
    22         if(!dfn[v]){
    23             tarjan(v);
    24             low[x]=min(low[x],low[v]);
    25         }
    26         else if(vis[v]){
    27             low[x]=min(low[x],dfn[v]);
    28         }
    29     }
    30     if(low[x]==dfn[x]){
    31         int cnt=0;
    32         while(1){
    33             int now=st.top();
    34             st.pop();
    35             vis[x]=0;
    36             cnt++;
    37             if(now==x) break;
    38         }
    39         if(cnt>1) ans=min(ans,cnt);
    40     }
    41 }
    42 
    43 
    44 int main(){
    45     scanf("%d",&n);
    46     int x;
    47     for(int i=1;i<=n;i++){
    48         scanf("%d",&x);
    49         ve[i].push_back(x);
    50     }
    51     for(int i=1;i<=n;i++){
    52         if(!dfn[i]){
    53             tarjan(i);
    54         }
    55     }
    56     printf("%d
    ",ans);
    57 }
    View Code
  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9989624.html
Copyright © 2011-2022 走看看