【問題描述】
有n個同學(編號為1到n)正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件(注意:可能有人可以從若干人那裡獲取資訊,但是每人只會把資訊告訴乙個人,即自己的資訊傳遞物件)。當有人從別人口中得知自己的生日時,遊戲結束。請問該遊戲一共可以進行幾輪?
【輸入格式】
輸入檔名為message.in。 輸入共2行。 第 1 行包含 1 個正整數n,表示n個人。 第 2 行包含n個用空格隔開的正整數t1,t2,… ,tn,其中第ti個整數表示編號為i 的同學的資訊傳遞物件是編號為ti的同學,ti≤n且ti≠i。 資料保證遊戲一定會結束。
【輸出格式】
輸出檔名為message.out。 輸出共1行,包含1個整數,表示遊戲一共可以進行多少輪。
【題解】
乙個赤裸裸的強連通分量啊!!
【**】
type
arr=record
y,next:longint;
end;
var e:array [0..200001] of arr;
n,ans,tail,en,dn,bn:longint;
v:array [0..200001] of boolean;
f,ls,a,low,dfn:array [0..200001] of longint;
procedure
add(o,p:longint);
begin
inc(en);
with e[en] do
begin
y:=p;
next:=ls[o];
ls[o]:=en;
end;
end;
function
min(o,p:longint):longint;
begin
if othen
exit(o);
exit(p);
end;
procedure
dfs(x:longint);
var i,j,sz:longint;
begin
inc(tail);
f[tail]:=x;
v[x]:=true;
inc(dn);
low[x]:=dn; dfn[x]:=dn;
i:=ls[x];
while i<>0
dowith e[i] do
begin
if dfn[y]=0
then
begin
dfs(y);
low[x]:=min(low[x],low[y]);
endelse
if v[y] then
low[x]:=min(low[x],dfn[y]);
i:=next;
end;
if low[x]=dfn[x] then
begin
inc(bn);
sz:=0;
repeat
inc(sz);
j:=f[tail];
dec(tail);
v[j]:=false;
a[j]:=bn;
until j=x;
if sz>1
then ans:=min(ans,sz);
end;
end;
procedure
tarjan;
var i:longint;
begin
ans:=maxlongint;
fillchar(dfn,sizeof(dfn),0);
fillchar(low,sizeof(low),0);
bn:=0; dn:=0; tail:=0;
for i:=1
to n do
if dfn[i]=0
then
dfs(i);
end;
procedure
init;
var i,y:longint;
begin
readln(n);
for i:=1
to n do
begin
read(y);
add(i,y);
end;
end;
begin
assign(input,'message.in');
assign(output,'message.out');
reset(input);
rewrite(output);
init;
tarjan;
write(ans);
close(input);
close(output);
end.
NOIP2015提高組Day1鬥地主
仔細看,這道題著實想不到什麼優美的演算法,那麼基本確定方向 dfs。先分析,這題的花色是沒用的 我們再分析,會發現這題的出牌順序是不影響答案的 那麼我們便可以先出牌多的 因為這樣答案便會先便小,那麼便可以方便後面的剪枝 也就是我們先打順子再打帶牌!順子是沒有什麼技巧的,便直接暴搜 當然也是先暴搜長度...
NOIP2015提高組Day1 鬥地主
這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 但是我們發現 這樣只要判斷前六種方法就行了,打幾個判斷,30 首先,做一下基本處理 簡化題目 因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。我們發現花色並沒有什麼用,可以免去。所以我們我們...
NOIP2015提高組Day1 神奇的幻方
問題描述 幻方是一種很神奇的 n n矩陣 它由數字1,2,3,n n 構成,且每行 每列及兩條對角線上的數字之和都相同。當n為奇數時,我們可以通過以下方法構建乙個幻方 首先將1寫在第一行的中間。之後,按如下方式從小到大依次填寫每個數k k 2,3,n n 1.若 k 1 在第一行但不在最後一列,則將...