受歡迎的牛 解題報告

2021-06-01 13:27:35 字數 1628 閱讀 2310

今天歐教讓我們學習一下強連通分量的tarjan演算法。

【題目名稱】:受歡迎的牛

description 

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

input 

第一行兩個數n,m。 

接下來m行,每行兩個數a,b,意思是a認為b是受歡迎的(給出的資訊有可能重複,即有可能出現多個a,b) 

output 

乙個數,即有多少頭牛被所有的牛認為是受歡迎的。

sample input 

3 31 2

2 12 3

sample output 

1【資料範圍】 

10%的資料n<=20, m<=50 

30%的資料n<=1000,m<=20000 

70%的資料n<=5000,m<=50000 

100%的資料n<=10000,m<=50000 

交了四次,wa完了。poj就是煩。。

和wjj對拍了10分鐘,沒有錯誤。。。

這道題首先考慮沒有環的情況。如果沒有環,則可知,如果出度為0的點只有乙個,那麼所有的牛都認為他受歡迎。如果超過乙個。則沒有這樣的牛。

所以可以考慮tarjan強連通縮點,如果出度為0的強連通塊只有乙個,那麼就輸出其中點的數量。其實tarjan並不難,只是一開始寫忘了考慮多個連通塊。

對於這種情況,5不會被加入<5>這個強連通塊。

關於tarjan演算法的解釋:

#include #include using std::cout;

using std::cin;

long n;

long tt = 0;

long t[10002];

long l[10002];

bool used[10002];

long top = 0;

long mm = 0;

long fl2[10002];

long fl[10002];

long stack[10002];

bool instack[10002];

long out[10002];

struct node

;node* dm[10002];

void insert(long a,long b)

void tarjan(long p)

if (l[p]==t[p])

fl[p] = mm;//打錯成fl[stack[p]]

fl2[mm]++;

instack[p] = false;

top--; }}

int main()

for (long i=1;iindex;

if (fl[i]!=fl[j])

ths = ths->next;

} }long cnt = 0;

long k = 0;

for (long i=1;i1)

k = i;

} }cout << fl2[k];

return 0;

}

BZOJ 1051 最受歡迎的牛 解題報告

題目直接擺在這裡!time limit 10 sec memory limit 162 mb submit 4438 solved 2353 submit status discuss 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這 種關係是具...

受歡迎的牛

題目大意 給你n個點,m條單項邊,求可以和所有點聯通的點的個數。注釋 n 10,000,m 50,000 想法 這題也是一道tarjan裸題,讓我來a掉吧!這題和愛在心中 愛在心中?猛戳 類似,只不過這題有坑.用panxf的模板a不掉這道題.為什麼呢?因為n的資料範圍,會mle。但是我們發現,這道題...

tarjan 受歡迎的牛

題 既然愛慕關係可以傳遞,那麼將互相可達的某幾個點縮成乙個點,就能簡化原圖了,那麼很自然想到tarjan求強連通分量 那麼就只需找到可以被所有縮點遍歷到的那個縮點 再輸出它所含的點數就行了 先用tarjan將所有聯通分量進行縮點,縮點後考慮出度為0的點的個數 1 個數大於1的時候,顯然不存在受歡迎的...