洛谷P2341(受歡迎的牛)題解

2021-08-28 03:14:04 字數 1395 閱讀 9280

題目描述

每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶

歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你

算出有多少頭奶牛可以當明星。

輸入輸出格式

輸入格式:

 第一行:兩個用空格分開的整數:n和m

 第二行到第m + 1行:每行兩個用空格分開的整數:a和b,表示a喜歡b

輸出格式:

 第一行:單獨乙個整數,表示明星奶牛的數量

輸入輸出樣例

輸入樣例#1: 複製

3 31 2

2 12 3

輸出樣例#1: 複製1說明

只有 3 號奶牛可以做明星

【資料範圍】

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

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

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

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

#include#include#includeusing namespace std;

const int maxn=100001;

int begin[maxn],next[maxn],to[maxn];

int tot,n,m;

int dfsn[maxn],low[maxn];

int stack_[maxn];

int num,cc[maxn],dis[maxn];

int put[maxn];

int flag[maxn];

void add_(int x,int y)

int find_(int x)

void tarjan(int u)

else if(find_(v))low[u]=min(low[u],dfsn[v]);

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

++dis[num];

cc[stack_[stack_[0]]]=num;

--stack_[0];

}}int main()

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

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

for(j=begin[i];j;j=next[j])

if(cc[i]!=cc[to[j]])

++flag[cc[to[j]]];

int flag2=0;

for(i=1;i<=num;++i)

if(!flag[i])dis[0]=dis[i],++flag2;

if(flag2>=2)printf("0");

if(flag2==1)printf("%d",dis[0]);

return 0;

}

洛谷 P2341 受歡迎的牛

畫一張圖形象一下 tarjan演算法模板,這裡用於縮點 1931 else if col k 3235 36 if low u dfn u 3746 pru.pop 47 48return 49 50signed main 5158 for register int i 1 i n i 5964 6...

洛谷P2341 受歡迎的牛

usaco03fall haoi2006 受歡迎的牛 g 洛谷 電腦科學教育新生態 luogu.com.cn 用 tarjan 縮點後,在每個強連通分量中的點都可以互相到達。在 dag 中 如果有大於 1 個出口,則兩個出口之間肯定不能相互到達,所以沒有明星 如果只有乙個出口,則別的點一定可以到出口...

Tarjan 洛谷 P2341 受歡迎的牛

每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格分開的整數 a和b,表示...