每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶
歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你
算出有多少頭奶牛可以當明星。
輸入格式:
第一行:兩個用空格分開的整數:n和m
第二行到第m + 1行:每行兩個用空格分開的整數:a和b,表示a喜歡b
輸出格式:
第一行:單獨乙個整數,表示明星奶牛的數量
輸入樣例#1:
3 31 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的思路
如果這個分量中的任意乙個點被仰慕,那麼說明這個分量中的所有的牛都會被仰慕,那麼我們就把這個圖全部縮成強連通分量,這個圖就變成有向無環圖。
這時我們會發現,被所有牛仰慕的牛出度一定是為0的,因為是有向無環圖,如果被所有牛仰慕,自己又仰慕別人,那麼就會產生乙個環。
因為我們只關注乙個分量的出度是否為0,所以不用判斷兩個分量間的邊是否重複統計
其次,如果這個圖存在乙個以上出度為0的強連通分量,這個圖就會變成非連通圖,就不存在被所有牛仰慕的牛,直接輸出0就ok啦。
放上**。
#include#include#include#include#include#includeusing namespace std;const int ma=1e4+5;
int n,m,sum,ans;
int head[ma],ecnt;
int low[ma],dfn[ma],ti;
int col[ma],cnt[ma],du[ma];
bool vis[ma];
struct sst[ma*10];
stacks;
inline void add(int a,int b)
inline int read()
void tar(int x)
else if(vis[y]) low[x]=min(low[x],dfn[y]);
}int sl;
if(dfn[x]==low[x]) while(sl!=x);
}}int main()
ecnt=0;
for(int i=1;i<=n;i++)
if(!dfn[i]) tar(i);
for(int k=1;k<=n;k++)
for(int i=head[k];i;i=t[i].nxt)
}int nw=0;
for(int i=1;i<=ecnt;i++)
if(!du[i])
nw=i;
}printf("%d\n",cnt[nw]);
return 0;
}
完成!謝謝
洛谷 P2341 HAOI2006 受歡迎的牛
a 喜歡 b,b 喜歡 c,那麼 a 也喜歡 c。牛欄裡共有 n 頭奶牛,給定一些奶牛之間的愛慕關係,請你算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和 m 第二行到第 m 1行 每行兩個用空格分開的整數 a 和 b,表示 a 喜歡 b 輸出格式 第一行 單獨乙個整數,表示...
洛谷P2341 HAOI2006 受歡迎的牛
每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格分開的整數 a和b,表示...
洛谷P2341 HAOI2006 受歡迎的牛
tarjan縮點,重建圖 自己的做法有點麻煩,其實只要記錄縮點後出度為0的點裡面有多少個點就可以了 如果存在多個出度為0的點,那麼就輸出0 include include include include includeusing namespace std const int maxn 100001...