這道題用來解決的方法很多,最近學了tarjan,所以我們不妨用tarjan來解決。
我們將這個關係用有向圖的方式存下來,那麼答案就是這個圖里最小的環的大小。對於tarjan陣列,我們記錄dfn代表時間戳,low代表其強連通分量中的根的時間戳(大概吧)。初始化dfn=low=++index,然後把這個點存進棧內,把代表訪問過的b陣列和在棧內的instack陣列都標記為true。鄰接表對該點所連的店遍歷,如果沒被訪問過,就遞迴下去,求那個點的tarjan,當前點low值=min(當前,下乙個)。如果下乙個點在棧內,就更新當前點的low值,如果low==dfn,我們就已經找到了乙個強聯通分量,將那個點所在的強連通分量內的點個數記錄出來,並把該點及其上面所有點出棧(相當於清除掉這個強連通分量)。如果該強連通分量不是乙個點,那麼更新答案為其min值。輸出即可
#include#include#include#includeusing namespace std;
const int maxn=200000+10;
int n;
int head[maxn],nnext[maxn],to[maxn];
int dfn[maxn],low[maxn];
bool b[maxn],instack[maxn];
int stack[maxn];
int tot;
int index;
int top;
int ans=1e9;
void add(int x,int y)
void tarjan(int x)
else if(instack[now])
}if(low[x]==dfn[x])
if(cnt!=1)
}}int main()
for(int i=1;i<=n;i++)
cout
}
P2661 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
P2661 資訊傳遞
題目描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取資...
P2661 資訊傳遞
並查集求解有向圖最小環 首先有個特殊要求的就是對於圖的邊是沒有長度的。然後我們採取乙個簡化操作,在找到這個環之間,由於只需要求環的長度,所以對於環的最後一條邊,不加入之前先判斷指向的點能不能最後指向原點。includeusing namespace std int n int ans 200050 ...