受歡迎的牛 tarjan求scc模板

2022-04-29 02:57:06 字數 1128 閱讀 8204

第一遍不太熟,第二遍飛快地打出來了

算是tarjan模板了吧,幾天了也總算是有一點對tarjan求法過程的理解了。

if(!dfn[u])tarjan(u),low[x] = min(low[x],low[u]);//如果沒有訪問過u,則tarjan一下,如果u走出去搞到的low更小則用這個更新x的low

else if(ins[u])low[x] = min(low[x],dfn[u]);//如果u訪問過但在棧裡,那麼u的low說不定已經被更新過了,如果此時令low[x]與low[u]取min,則回溯時作為祖先的u的low與dfn就不相等了欸在這道題裡好像確實是等價的,可能在其他tarjan演算法裡不等價吧,那我還是不太知道為什麼在這裡與dfn[u]取min了。。。whatsapity..

1 #include2 #include3 #include4 #include5 #include6 #include7

8using

namespace

std; 910

const

int maxn = 10010

; 11

12 vectorg[maxn],scc[maxn];

13int

stack[maxn],ins[maxn],inscc[maxn];

14int

dfn[maxn],low[maxn],oud[maxn];

15int

n,m,cntv,cntscc,top;

1617

void tarjan(int

x)25

if(dfn[x] ==low[x])33}

34}3536

intmain()

44for(int i = 1;i <= n;i++)if(!dfn[i])tarjan(i);

45for(int i = 1;i <= cntscc;i++)52}

53}54int ans = 0;55

for(int i = 1;i <= cntscc;i++)if(!oud[i])

57 ans =scc[i].size();58}

59 cout <

60return0;

61 }

view code

tarjan 受歡迎的牛

題 既然愛慕關係可以傳遞,那麼將互相可達的某幾個點縮成乙個點,就能簡化原圖了,那麼很自然想到tarjan求強連通分量 那麼就只需找到可以被所有縮點遍歷到的那個縮點 再輸出它所含的點數就行了 先用tarjan將所有聯通分量進行縮點,縮點後考慮出度為0的點的個數 1 個數大於1的時候,顯然不存在受歡迎的...

受歡迎的牛(tarjan)

題目連線 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第一行兩個數n,m。接下來m行,每行兩個數a,b,意思...

受歡迎的牛 Tarjan

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 頭牛,給你 對整數 表示牛 認為牛 受歡迎。這種關係是具有傳遞性的,如果 認為 受歡迎,認為 受歡迎,那麼牛 也認為牛 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。輸入格式 第一行兩個數 接下來 行,每行兩個數 意思是 認為 是...