tarjan 受歡迎的牛

2021-09-05 15:52:23 字數 1321 閱讀 9583

既然愛慕關係可以傳遞,那麼將互相可達的某幾個點縮成乙個點,就能簡化原圖了,

那麼很自然想到tarjan求強連通分量

那麼就只需找到可以被所有縮點遍歷到的那個縮點

再輸出它所含的點數就行了

先用tarjan將所有聯通分量進行縮點,縮點後考慮出度為0的點的個數:

(1)個數大於1的時候,顯然不存在受歡迎的牛!

(2)個數等於0的時候,假設有一頭牛x是受歡迎的,那麼它必定有喜歡的牛y,而它又收到牛y的歡迎,說明存在環,不是dag圖,矛盾!

(3)個數等於1的時候,用數學歸納法推一下,有這樣乙個結論:出度為0的那個點可以被其它所有點到達

#include #include #include #include const int maxm=5e4+5;

int n, m, a, b, cnt, num, top, col;

int head[maxm];

int s[maxm];

int st[maxm];

int co[maxm];

int de[maxm];

int dfn[maxm], low[maxm];

using namespace std;

struct cow edge[maxm];

void add(int x, int y)

void tarjan(int u) else if(co[v] == 0)

low[u] = min (low[u], low[v]);

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

--top; }}

int main()

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

if (!dfn[i])

tarjan (i);

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

for (int j = head[i]; j; j = edge[j].next)

int ans = 0, u = 0;

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

if(de[i] == 0)

if(u == 1)

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

else

printf("0\n");

return 0;

}

void tarjan(int 當前點)

如果目標點被訪問過

}如果當前點的low==dfn

}

受歡迎的牛(tarjan)

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

受歡迎的牛 Tarjan

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

2017 07 14 Tarjan(受歡迎的牛)

include include include include include include include include include define mm 50002 define nn 10002 using namespace std int n,m,cnt,sign,top,tot i...