第一遍不太熟,第二遍飛快地打出來了
算是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 #include7view code8using
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 }
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
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 頭牛,給你 對整數 表示牛 認為牛 受歡迎。這種關係是具有傳遞性的,如果 認為 受歡迎,認為 受歡迎,那麼牛 也認為牛 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。輸入格式 第一行兩個數 接下來 行,每行兩個數 意思是 認為 是...