HAOI2006 受歡迎的牛

2022-05-01 05:51:09 字數 1571 閱讀 3679

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

歡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

思路:tarjan+縮點

**實現:

1 #include2 #include3

const

int maxn=1e4+10;4

const

int maxm=1e5+10

;5 inline int min_(int x,int y)

6int

n,m,pro,ans;

7int

a,b;

8int

h[maxn],hs;

9int

e_q[maxm],e_z[maxm],e_n[maxm];

10int

dn[maxn],fl[maxn],st[maxn],dns,top;

11int

color[maxn],num[maxn],cd[maxn],ld[maxn],cs;

12bool

v[maxn],map[maxn][maxn];

13void tarjan(int

k)21

if(v[e_z[i]]) fl[k]=min_(fl[k],dn[e_z[i]]);22}

23if(dn[k]==fl[k])30}

31}32int

main()

40for(int i=1;i<=n;i++) if(!dn[i]) tarjan(i);

41for(int i=1;i<=m;i++) if(color[e_q[i]]!=color[e_z[i]]) ++cd[color[e_q[i]]];

42for(int i=1;i<=cs;i++) if(!cd[i]) ans=num[i],pro++;

43if(pro==1) printf("

%d\n

",ans);

44else puts("0"

);45

return0;

46 }

我竟然在遞迴函式裡使用了全域性過程變數,而且7a3t。。。然後,就坑的很慘了。

HAOI2006 受歡迎的牛

題目 分析 tarjan縮點。最後如果只有乙個出度為0的點,則答案就是這個點包含的牛數,否則為0.一開始最後統計的時候寫了dfs,後來發現是錯誤的,反例 include include include include include using namespace std const int tma...

HAOI2006 受歡迎的牛

這個就是強連通,計算出度為0的點就好 也沒森麼其它好講的啦 提交傳送們 description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多...

HAOI2006 受歡迎的牛

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