今天歐教讓我們學習一下強連通分量的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的時候,顯然不存在受歡迎的...