NOIP2015提高組Day1 資訊傳遞

2021-07-22 13:44:48 字數 2542 閱讀 5068

【問題描述】

有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 在第一行但不在最後一列,則將...