題目描述
每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶
歡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,表示...