思路 : 首先用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 接下來...