1. 程式人生 > >洛谷2661 信息傳遞 三倍經驗?

洛谷2661 信息傳遞 三倍經驗?

最小 std %d -s for pac 拓撲排序 esp 經驗

問題描述

有n個同學(編號為1到n)正在玩一個信息傳遞的遊戲。在遊戲裏每人都有一個固定的信息傳遞對象,其中,編號為i的同學的信息傳遞對象是編號為Ti同學。

遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日信息告訴各自的信息傳遞對象(註意:可能有人可以從若幹人那裏獲取信息,但是每人只會把信息告訴一個人,即自己的信息傳遞對象)。當有人從別人口中得知自己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?

三倍經驗?

只要找出最小環的大小就可以,看見題解裏有很多拓撲排序的,還有用tarjan的,我用了一個dfs樹,如果有返祖的就記錄最小的深度。

其他兩種做法我還會回來補充上(大概)

DFS樹

#include<bits/stdc++.h>
using namespace std;
int n,ans=200000000;
int to[200005],num[200005],dep[200005],tot;
void dfs(int x,int d){
    dep[x]=d;
    num[x]=tot;
    if(dep[to[x]]){
        if(num[to[x]]!=tot)return ;
        else ans=min(ans,d-dep[to[x]]+1);
    }
    else dfs(to[x],d+1);
}
int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&to[i]); } for(int i=1;i<=n;i++){ if(!dep[i]){ tot=i; dfs(i,1); } } printf("%d",ans); }

洛谷2661 信息傳遞 三倍經驗?