洛谷P2341 HAOI2006 受歡迎的牛

2021-08-15 15:00:09 字數 1503 閱讀 1657

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

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

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

輸入格式:

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

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

輸出格式:

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

輸入樣例#1:

3 3

1 22 1

2 3

輸出樣例#1:

1

只有 3 號奶牛可以做明星

【資料範圍】

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

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

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

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

強連通分量裸題。。。

在有向圖中,如果有且僅有乙個點的出度為0 (沒有指向其他點的邊),那麼該點可以被所有點遍歷到;反之,該圖中沒有可以被所有點遍歷到的點;

在有向圖中,如果乙個點可以被所有點遍歷到,那麼這個點的出度為0

附**:

#include#include#include#include#define maxn 10010

#define maxm 50010

using namespace std;

int n,m,c=1,d=1,top=1,s=0,ans=0;

int cstack[maxn],head[maxn],deep[maxn],low[maxn],colour[maxn],num[maxn],sum[maxn];

bool beque[maxn];

struct nodea[maxm<<1];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline void add(int x,int y)

void work(int x)

else if(beque[t])

low[x]=min(low[x],deep[t]);

} if(low[x]>=deep[x])while(cstack[--top]!=x); }}

int main()

for(int i=1;i<=n;i++)if(!deep[i])work(i);

for(int i=1;i<=n;i++)num[colour[i]]++;

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

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

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

if(!sum[i])

ans=i;

} printf("%d\n",num[ans]);

return 0;

}

洛谷 P2341 HAOI2006 受歡迎的牛

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

洛谷P2341 HAOI2006 受歡迎的牛

tarjan縮點,重建圖 自己的做法有點麻煩,其實只要記錄縮點後出度為0的點裡面有多少個點就可以了 如果存在多個出度為0的點,那麼就輸出0 include include include include includeusing namespace std const int maxn 100001...

洛谷P2341 HAOI2006 受歡迎的牛

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