HAOI2006 受歡迎的牛 強連通分量

2022-05-24 08:42:08 字數 1253 閱讀 9211

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有 $n$ 頭牛,給你 $m$ 對整數 $(a,b)$,表示牛 $a$ 認為牛 $b$ 受歡迎。這種關係是具有傳遞性的,如果 $a$ 認為 $b$ 受歡迎,$b$ 認為 $c$ 受歡迎,那麼牛 $a$ 也認為牛 $c$ 受歡迎。你的任務是求出有多少頭牛被除自己之外的所有牛認為是受歡迎的。

loj 10091

luogu 2341

用 tarjan 演算法找出圖中每乙個強連通分量,縮點,然後轉化為有向無環圖。

在乙個強連通分量裡的牛互相認為彼此是受歡迎的,由於關係是具有傳遞性的,只要其它強連通分量都有某頭牛認為這個強連通分量的某頭牛是受歡迎的,那麼這個強連通分量的牛都是受歡迎的。

對於已經完成縮點後的圖:

所以,對於縮點後的圖,只能有乙個點被其它點指向或間接指向,否則輸出 0。

scc[u]表示 $u$ 所在強連通分量的序號;sccsize[i]表示序號為 $i$ 的強連通分量中,節點的數目;scctot表示強連通分量的個數。

out[i]表示序號為 $i$ 的強連通分量出邊數目(出度)。

#include #include const int vsize = 100005;

const int esize = 400005;

int out[vsize];

int scc[vsize], sccsize[vsize], scctot;

int st[vsize], top;

int low[vsize], dfn[vsize], time;

int h[esize], to[esize], nxt[esize], tot;

int min(int x, int y)

void add(int x, int y)

void tarjan(int x) else if (!scc[y])

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

top--; }}

int main()

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

for (int i = 1; i <= n; i++)

} for (int i = 1; i <= scctot; i++)

} printf("%d\n", ans);

return 0;

}

HAOI2006 受歡迎的牛

題目 分析 tarjan縮點。最後如果只有乙個出度為0的點,則答案就是這個點包含的牛數,否則為0.一開始最後統計的時候寫了dfs,後來發現是錯誤的,反例 include include include include include using namespace std const int tma...

HAOI2006 受歡迎的牛

這個就是強連通,計算出度為0的點就好 也沒森麼其它好講的啦 提交傳送們 description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多...

HAOI2006 受歡迎的牛

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