[haoi2006]受歡迎的牛
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數(a,b),表示牛 a 認為牛
b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。
第1行兩個整數n,m;
接下來m行,每行兩個數a,b,意思是a認為b是受歡迎的(給出的資訊有可能重複,即有可能出現多個a,b)
乙個數,即有多少頭牛被所有的牛認為是受歡迎的。
3 3 1 2 2 1 2 3
110%的資料n<=20,m<=50
30%的資料n<=1000,m<=20000
70%的資料n<=5000,m<=50000
100%的資料n<=10000,m<=50000
1/*2**明顯tarjan縮點
3輸入可能重複 那就只好從出度下手
4跑縮點後的圖
5找沒有出度的點
6若只有乙個這樣的點 就輸出數量
7否則就為0
8因為若有兩個這樣的點
9那麼沒有牛是被所有牛所喜愛的 自己想一想吧
10*/
11 #include 12 #include 13
14const
int maxn=10010;15
const
int maxm=50010;16
17int
n,m,cnt,top,id;
1819
intdfn[maxn],low[maxn];
2021
int stack[maxn],belong[maxn],in
[maxn],sum[maxn];
2223
bool
vis[maxn];
2425
struct
edg ;
29 edg e[maxm<<1
];30
31int
head[maxn],tot;
3233 inline void read(int&x)
3940 inline int min(int a,int
b) 43
44 inline void add(int x,int
y) 49
50void tarjan(int
u) 60
else
if(vis[v]) low[u]=min(low[u],dfn[v]);61}
62if(dfn[u]==low[u]) while(u!=t);72}
73return;74
}7576int
hh()
84for(register int i=1;i<=n;++i)
85if(!dfn[i]) tarjan(i);
86for(register int i=1;i<=n;++i)
87for(register int j=head[i];j;j=e[j].next) 92}
93int ans=0,tot=0,t=0;94
for(register int i=1;i<=id;++i)
95if(!in[i]) ++tot,ans+=sum[i];
96 printf("
%d\n
",tot==1?ans:t);
97return0;
98}
99100
int sb=hh();
101int main()
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 受歡迎的牛
1051 haoi2006 受歡迎的牛time limit 10 sec memory limit 162 mb submit 7267 solved 3868 submit status discuss 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受...