牛客網 HAOI2006 受歡迎的牛

2021-09-23 22:39:50 字數 1026 閱讀 1071

思路 : 首先用tarjan縮點,那麼原圖就成了dag, 判定的條件為 新的dag圖如果只有乙個點 (該點可能是孤立的也可能是幾個)的出度為0, 那麼就將這個點的原圖 (可以說是他所包含的原點的集合)中的點的數目表示出來,但是如果出度為0的點個數大於1了,則不成立,直接輸出0,因為這樣的話就出現兩個牛群(牛群可能是乙隻牛也可能是幾隻牛),那麼就無法做到強連通。

ac**如下 :

#includeusing namespace std;

const int maxn = 1e5 + 5; // 1e4會越界

struct node

e[maxn];

int dfn[maxn], low[maxn], sum[maxn], cnt, tot, scnt; // sum記錄dag每個「點」包含原圖點的個數

int head[maxn], out[maxn], suo[maxn], n, m; //out表示出度, suo用來存縮點後的新點

bool vis[maxn];

stack st;

void add (int from, int to)

void tarjan (int x)

else if (vis[e[i].v]) low[x] = min (low[x], dfn[e[i].v]);

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

while (k != x);

}}int main()

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

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

}int ans = 0, oscnt = 0;

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

if (oscnt > 1) cout << 0 << endl;

else cout << ans << endl;

return 0;

}

事實上,suo陣列中存的新dag點,就是按照tarjan的流程來的

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 接下來...